<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dev_yohan.log</title>
        <link>https://velog.io/</link>
        <description>코드 깍는 개발자 kangyohan.dev.0421@gmail.com</description>
        <lastBuildDate>Mon, 09 Mar 2026 05:12:25 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dev_yohan.log</title>
            <url>https://velog.velcdn.com/images/dev_yohan/profile/7f259de0-0326-4c44-bc07-d456f412a088/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dev_yohan.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev_yohan" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[OCR(광학 문자 인식, Optical Character Recognition)]]></title>
            <link>https://velog.io/@dev_yohan/OCR%EA%B4%91%ED%95%99-%EB%AC%B8%EC%9E%90-%EC%9D%B8%EC%8B%9D-Optical-Character-Recognition</link>
            <guid>https://velog.io/@dev_yohan/OCR%EA%B4%91%ED%95%99-%EB%AC%B8%EC%9E%90-%EC%9D%B8%EC%8B%9D-Optical-Character-Recognition</guid>
            <pubDate>Mon, 09 Mar 2026 05:12:25 GMT</pubDate>
            <description><![CDATA[<p>오랜만에 글도 쓰고... 취직도 잘 안돼... 외주 받으면서 작업을 하는데 이 기술이 필요해서 이번 글에는 개념만이라도 정리해 봅시다 :)</p>
<h2 id="ocr">OCR</h2>
<p><strong>Optical Character Recognition</strong>
간단하게 사람이 눈으로 문자를 인식 하는것 처럼 컴퓨터가 문자를 인식하는 기술</p>
<p><strong>가능한 이유!</strong></p>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/c5f1fe7f-00b3-4d40-8216-57c37abb9dc7/image.png" alt=""></p>
<p>이 이미지와 1이라는 이미지를 수천장 수만장을 학습을 한 후에 스스로 패턴을 인식하고, 스스로 생각을 하게 합니다! 이게 바로 딥러닝 학습덕분이죠 </p>
<h3 id="학습-방법">학습 방법</h3>
<h4 id="사람">사람</h4>
<pre><code>사람 눈 → &#39;1&#39; 라는 글자로 인식</code></pre><h4 id="컴퓨터">컴퓨터</h4>
<pre><code>컴퓨터  → 픽셀 숫자값 (0~255) 로 인식 패턴 분석해서 &#39;1&#39; 라고 판단</code></pre><p>지금은 간단하게 정리만하고 활용 예제나 작업을 하면서 했던 기술들 정리해서 다음글에서 뵙겠습니다! 
글 읽어주셔서 감사합니다 :)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git ? GitHub(깃허브)?, gitLab(깃랩)? 그래서 뭐야 ]]></title>
            <link>https://velog.io/@dev_yohan/Git-GitHub%EA%B9%83%ED%97%99-gitLab%EA%B9%83%EB%9E%A9-%EA%B7%B8%EB%9E%98%EC%84%9C-%EB%AD%90%EC%95%BC</link>
            <guid>https://velog.io/@dev_yohan/Git-GitHub%EA%B9%83%ED%97%99-gitLab%EA%B9%83%EB%9E%A9-%EA%B7%B8%EB%9E%98%EC%84%9C-%EB%AD%90%EC%95%BC</guid>
            <pubDate>Thu, 09 Oct 2025 02:35:50 GMT</pubDate>
            <description><![CDATA[<p>뭐 .. 작업하면서 오류도 많이 나고 이슈도 찾아보면서 github라는 튤을 더 이해하고 잘 쓰고 싶어 작성을 해봅니다! 사랑에 빠진 줄~</p>
<h1 id="git">Git</h1>
<h3 id="공식-사이트">공식 사이트</h3>
<p><a href="https://git-scm.com/">https://git-scm.com/</a></p>
<h3 id="설명">설명</h3>
<p>프로젝트에서 사용되는 버전을 분산시켜 컨트롤 할 수 있는 시스템이라고 공식 사이트에 나와 있습니다. 고급언어와 관련된 런타임 오버 헤드를 줄였으며, 모든 프로젝트 암호화 하여 무결성 유지 하고 있습니다.</p>
<p>Git 은 리눅스 커널에 작동되면 C 언어로 만들어 졌습니다.</p>
<h3 id="개념">개념</h3>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/557c4e6a-b943-4f97-9a98-dc358b07c9f3/image.png" alt="">
공식 사이트 개념 설명 영상 중</p>
<p>하나의 프로젝트에 다양한 직군과 다양한 작업을 동시에 작업을 할 수 있으면 시간 별로 Tracking을 남기며 각 commit 한 기점으로 작업을 merge 하거나 rollback 할 수 있다 </p>
<p>공식 사이트에 proGit 이라는 책을 제공해주네요 취직하면 꼭 한번 읽어봐야지.. 색인부분에 github,gitLab 도 보이고 gitWeb라는 것 도 있네요.  </p>
<h3 id="기본-명령어-및-설명">기본 명령어 및 설명</h3>
<p><a href="https://git-scm.com/docs/gittutorial">https://git-scm.com/docs/gittutorial</a></p>
<h1 id="github-깃허브">GitHub 깃허브</h1>
<p>깃헙 개발자 직군 뿐만 아니라 다양한 직군분들도 한번쯤 들어 봤을 만한 <strong>깃허브</strong> 
저도 학생 때는 깃헙을 많이 사용하지 않았는데 협업을 하면서 프로젝트 관리도 힘들어서 깃허브를 사용함으로 많이 유용하고 느끼고</p>
<h3 id="공식-사이트-1">공식 사이트</h3>
<p><a href="https://github.com">https://github.com</a></p>
<h3 id="공식-문서">공식 문서</h3>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/9627f204-6e42-40e2-a682-1370e43fc548/image.png" alt=""></p>
<h3 id="git-과-github-관계">Git 과 GitHub 관계</h3>
<p>GtiHub는 코드를 저장하고 공유하고 다른 사람들과 함께 코드를 작성 할 수 있는 기반 플랫폼이다. 
GitHub에 파일을 업로드 하면 파일을 Git 리포지토리에 저장을 하고, GitHub에 파일을 변경하거나, 커밋을 Git에서 변경 내용을 자동으로 추적하고 관리를 한다. </p>
<ul>
<li>Git은 원격장소 역할이고 GitHub는 공유하는 온라인 플랫폼이다. </li>
<li>Git 기반으로 동작하고, 이슈 및 리뷰 등 다양한 지원을 한다.</li>
</ul>
<p>참고 
<a href="https://docs.github.com/ko/get-started/start-your-journey/about-github-and-git">https://docs.github.com/ko/get-started/start-your-journey/about-github-and-git</a></p>
<h1 id="gitlab">GitLab</h1>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/bf3ac391-d310-4abb-a5cc-c2bd34745766/image.png" alt=""></p>
<h3 id="공식-사이트-2">공식 사이트</h3>
<p><a href="https://about.gitlab.com">https://about.gitlab.com</a></p>
<p>GitLab 공식 사이트 설명 중 
GitLab 버전 관리 프로젝트 관리를 도와준다고 한다. 전체 적인 내용은 DevOps에 특화된 서비스 처럼 보인다. 깃허브를 대체 할 수 있고, 젠킨스도 대체할 수 있다고 나와 있다고 한다.</p>
<p>흠.. 이러면 GitHub랑 뭔 차이지? 라는 생각을 했다.</p>
<h3 id="gitlab-파이프-라인">GitLab 파이프 라인</h3>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/bc4a6e05-33cb-41a7-91fc-366d21661dac/image.png" alt=""></p>
<h3 id="github-vs-gitlab">GitHub vs GitLab</h3>
<p>작성자 생각은 GitHub와 GitLab은 둘 다 Git 소프트웨어 기반 서비스 이고 GitHub는 협업 중심에 서비스와 커뮤니티를 중점으로 하고 GitLab은 인프라 적인 관점으로 배포 와 성능 튜닝을 중점을 둔거 같다. 
GitLab은 중앙서버를 회사 측에서 가질 수 있으며, GitHub는 중앙서버가 GitHub이다.</p>
<h3 id="후기">후기</h3>
<p>다 써봐야 차이점을 정확하게 알 수 있을 거같다.. GitLab은 한국어 지원이 안되네요 ㅠㅠ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Nginx를 사용한 이미지 서빙]]></title>
            <link>https://velog.io/@dev_yohan/Nginx-%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%84%9C%EB%B9%99</link>
            <guid>https://velog.io/@dev_yohan/Nginx-%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%84%9C%EB%B9%99</guid>
            <pubDate>Wed, 10 Sep 2025 13:53:32 GMT</pubDate>
            <description><![CDATA[<h2 id="왜-nginx로-이미지를-서빙할까-🤔">왜 Nginx로 이미지를 서빙할까? 🤔</h2>
<p>프로젝트 구조에서 프론트엔드는 React, 백엔드는 Spring으로 REST API를 구현하고 있다. 일반적으로 이미지를 업로드하면 front → back → server 흐름으로 서버에 저장된다. 하지만 React는 빌드된 상태에서 public/ 디렉토리 안의 정적 파일만 접근할 수 있다. 따라서 업로드된 이미지를 전부 public/에 넣는 방식은 프로젝트가 무거워지고, 관리 또한 어렵다.
이 때문에 이미지를 서버 디렉토리에 따로 저장하고, Nginx를 이용해 정적 파일을 서빙하는 방식을 많이 사용한다. <strong>AWS</strong> 환경에서는 <strong>S3가</strong> 이런 정적 파일 관리 역할을 대신한다.</p>
<h2 id="방법">방법</h2>
<h3 id="nginx">Nginx</h3>
<pre><code class="language-nano">server{
    # ssl 인증 443 내용


    location /img {
    alias 이미지 디렉토리/; 
    }
}</code></pre>
<p><strong>location</strong> 블록 접속 경로
<strong>alias</strong> URL 경로를 실제 디스크 경로와 연결</p>
<h3 id="test">Test</h3>
<pre><code class="language-vim">$sudo nginx -t  #nginx 테스트 
$sudo systemctl nginx reload # nginx 재 설정 </code></pre>
<h3 id="결과">결과</h3>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/8912f387-08e1-4750-973f-c2119938c301/image.png" alt=""></p>
<p>짜잔 ~ </p>
<p>글 읽어 주셔서 감사합니다! :) </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Nginx SSL 인증]]></title>
            <link>https://velog.io/@dev_yohan/Nginx-SSL-%EC%9D%B8%EC%A6%9D</link>
            <guid>https://velog.io/@dev_yohan/Nginx-SSL-%EC%9D%B8%EC%A6%9D</guid>
            <pubDate>Wed, 10 Sep 2025 03:30:54 GMT</pubDate>
            <description><![CDATA[<h1 id="ssltls인증">SSL/TLS인증</h1>
<pre><code>https 접속을 하기 위한 인증</code></pre><h2 id="http-와-https-차이점">http 와 https 차이점</h2>
<h3 id="httphypertext-transfer-protocol">http(Hypertext Transfer Protocol)</h3>
<p>네트워크 통신 모델의 애플리케이션 계층 프로토콜로, 웹에서 데이터를 주고받는 기본 규약이다.
클라이언트는 서버에 <strong>GET, POST, PATCH, DELETE</strong> 등 다양한 메서드로 요청을 보내며, 이때 요청과 응답은 <strong>평문</strong>(plain text) 으로 전달된다. 따라서 제3자가 네트워크를 엿보면 요청 URL, 헤더, 본문 내용까지 그대로 볼 수 있다.
요청의 결과는 200 OK, 404 Not Found, 301 Redirect 같은 <strong>상태 코드</strong>로 표현된다. </p>
<h3 id="httpshypertext-transfer-protocol-secury">https(Hypertext Transfer Protocol secury)</h3>
<p>HTTP 위에 TLS/SSL 계층을 덧붙여 보안을 강화한 프로토콜이다.
HTTP가 평문으로 데이터를 주고받는 반면, HTTPS는 암호화된 통신 채널을 통해 데이터를 주고받아 기밀성(Encryption), 무결성(Integrity), 인증(Authentication) 을 보장한다.
또한 최신 HTTPS는 보통 <strong>HTTP/2나 HTTP/3</strong>와 결합되어, 텍스트 대신 바이너리 형식으로 데이터를 교환하여 전송 <strong>효율</strong>과 <strong>성능</strong>까지 개선한다.
즉, HTTPS는 단순히 데이터를 주고받는 것뿐만 아니라, 통신 과정에서 SSL 인증서를 통해 서버의 신원을 확인하고, 중간자 공격이나 데이터 탈취를 막아 안전한 웹 환경을 제공한다.</p>
<hr>
<h2 id="왜----https-를-사용해야하나-">왜 ? ? ? https 를 사용해야하나 ?</h2>
<h3 id="보안">보안</h3>
<ul>
<li><p>HTTP 평문 전송이라 도청·위변조 위험 있음.</p>
</li>
<li><p>HTTPS 모든 데이터를 암호화해 신용카드·개인정보 같은 민감한 정보 보호에 안전.</p>
<h3 id="신뢰">신뢰</h3>
</li>
<li><p>검색엔진은 HTTPS 사이트를 더 신뢰해 검색 순위(SEO) 에서 유리함.</p>
</li>
<li><p>브라우저도 HTTPS에 🔒 아이콘을 표시해서 사용자 신뢰도를 높여줌.</p>
</li>
</ul>
<h3 id="성능--분석">성능 &amp; 분석</h3>
<ul>
<li><p>HTTPS는 HTTP/2, HTTP/3와 함께 더 빠르게 동작함.</p>
</li>
<li><p>또한 트래픽 출처(추천 링크, 광고, 소셜 미디어 등)를 정확히 분석할 수 있어 마케팅/SEO에 중요.</p>
</li>
</ul>
<p>SEO 최적화.. 중요하죠 검색엔진에 상단에 출력해야 하니깐요.
네이버 서치 어드바이저 등 공식 문서 확인했던게...</p>
<p>자 자 설명은 그만하고 </p>
<h2 id="nginx-ssl-인증">Nginx SSL 인증</h2>
<h3 id="http-01-챌린지">HTTP-01 챌린지.</h3>
<ol>
<li><p>클라이언트(certbot)가 토큰 파일 생성</p>
</li>
<li><p>Nginx/Apache가 해당 파일을 서비스</p>
</li>
<li><p>Let’s Encrypt 서버가 http://도메인/.well-known/acme-challenge/토큰 요청</p>
</li>
<li><p>파일이 정상 응답되면 도메인 소유권 인증 완료 → SSL 인증서 발급</p>
</li>
</ol>
<hr>
<p>ubuntu 18 버전  이상시 python3 로 대체 되었습니다. 이거 꼭 버전 확인해주세요</p>
<h3 id="certbot">certbot</h3>
<h4 id="httpscertbotefforg"><a href="https://certbot.eff.org/">https://certbot.eff.org/</a></h4>
<p>현재 certbot 에서  snap 이랑 pip 방식만 권장하고있어 apt 는 공식문서에 없었습니다. apt 방식이면 글 참고 해주세요! </p>
<p><strong>install</strong>
$ apt-get update
$ sudo apt-get install certbot
$ apt-get install python3-certbot-nginx</p>
<p><strong>인증서 생성</strong>
$  sudo certbot --nginx -d example.com -d <a href="http://www.example.com">www.example.com</a></p>
<p>두 도메인 관련 nginx 추가 되었는데 방식이 맘에안들어서 조금 수정하겠습니다. </p>
<pre><code>server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name example.com www.example.com;

    location /.well-known/acme-challenge/ {
        root /var/www/html;
    }

    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    server_name example.com www.example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;   # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;     # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf;                       # managed by Certbot

    location / {
        proxy_pass http://127.0.0.1:3000;  #proxy_server
        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For                           $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Host  $host;
        proxy_set_header X-Forwarded-Port  443;

        proxy_redirect http:// https://;
        proxy_buffering off;
    }

}
</code></pre><p>참고 글 <a href="https://nginxstore.com/blog/nginx/lets-encrypt-%EC%9D%B8%EC%A6%9D%EC%84%9C%EB%A1%9C-nginx-ssl-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0/">https://nginxstore.com/blog/nginx/lets-encrypt-%EC%9D%B8%EC%A6%9D%EC%84%9C%EB%A1%9C-nginx-ssl-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0/</a></p>
<p>글 읽어주셔서 감사합니다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Nginx 동작원리(feat Aparch,Tomcat) 꼭 보세요! ]]></title>
            <link>https://velog.io/@dev_yohan/Nginx-%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC</link>
            <guid>https://velog.io/@dev_yohan/Nginx-%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC</guid>
            <pubDate>Sat, 06 Sep 2025 04:55:08 GMT</pubDate>
            <description><![CDATA[<h1 id="nginx-동작원리">Nginx 동작원리</h1>
<p>Nginx가 나오는데 왜 Nginx가 나왔고 동작원리 및 여러가지에 이점이 있어서 아직도 사랑 받고 있을까 부터 생각했습니다!</p>
<h2 id="nginxapachetomcat">Nginx,Apache,Tomcat</h2>
<p>백엔드를 공부 하다 보면 Tomcat,Apach 는 많이 들어 봤을 거다. </p>
<p>이들의 동작 방식을 정리하면 왜 nginx를 공부해야하는지 알고 잘 알 수 있을 수 거 같다. </p>
<h2 id="tomcat">Tomcat</h2>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/e50a4f4b-dd22-449a-aab4-b175cf9ccb1c/image.webp" alt=""></p>
<p> <strong>tomcat</strong>은 <strong>WAS(Web Application Server),servlet container</strong> 라고 부르는곳이 있다고 한다.
 기본 포트 8080포트 사용</p>
<pre><code>JSP,Servlet container에 대한 동적인 웹 페이지를 처리한다.</code></pre><ol>
<li>Client 요청</li>
</ol>
<ul>
<li>클라이언트가 /login 이라는 요청을 날린다. </li>
<li>http 프로토콜은 tomcat 한테 전달 됨 </li>
</ul>
<ol start="2">
<li>Tomcat mapping을한다.</li>
</ol>
<ul>
<li>Tomcat 에서 클라이언트가 보낸 요청에 맞는 servlet 를 찾아 매핑</li>
</ul>
<ol start="3">
<li>Controller(Servlet)</li>
</ol>
<ul>
<li>해당 servlet이 생된다. </li>
<li>servlet 에 맞는 service 로직 실행</li>
</ul>
<ol start="4">
<li>Response 응답 </li>
</ol>
<ul>
<li>service 로직에서 실행된 결과를 response 객체에 담아 jsp 에 전달된다.</li>
</ul>
<ol start="5">
<li>JSP</li>
</ol>
<ul>
<li>response 객체를 받아 html를 동적으로 구성한다. </li>
</ul>
<h2 id="apache">Apache</h2>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/3896b202-ee06-41ba-a1c3-3fa5adebb61a/image.jpeg" alt=""></p>
<pre><code>정적 웹 서버(웹서버)HTML, CSS, JS, 이미지 같은 정적 파일처리,프록시 역할</code></pre><ol>
<li>사용자 <a href="http://naver.com">http://naver.com</a> 요청</li>
<li>80,443(http-&gt;80, https-&gt;433) 받고 8080으로 Proxy 한다. </li>
<li>Tomcat 에 server.xml 설정으로 connector 에서 8080설정이면 모든 8080포트에 대한 설정을 인식한다.</li>
<li>tomcat 실행</li>
</ol>
<h2 id="apache--tomcat">Apache + Tomcat</h2>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/09d7e3c4-7cef-4ced-ba7e-5a93748b2e40/image.webp" alt=""></p>
<h2 id="nginx">Nginx</h2>
<pre><code>정적 웹 서버(웹서버)HTML, CSS, JS, 이미지 같은 정적 파일처리,프록시 역할</code></pre><p>이러면 단순히 Nginx 와 Apache 가 뭐 가 다르지? 이렇게 느낄수 있다.</p>
<p>Nginx 동작 원리에서 장점을 찾아 볼 수 있다. 
<img src="https://velog.velcdn.com/images/dev_yohan/post/b3659576-4d34-411d-bb0a-ffe00b063d12/image.webp" alt=""></p>
<p>worker 보단 process 가 조금 더 자연 스럽겠네요</p>
<h3 id="master">Master</h3>
<p>클라이언트의 요청에 따라 worker 에 작업을 할당합니다. 작업이 워커에 할당되면 마스터는 클라이언트의 다음 요청을 기다리지 않고 대기한다. worker로부터 응답이 오면 마스터는 클라이언트로 응답을 전송합니다.</p>
<h3 id="worker">worker</h3>
<p> 각 Worker 는 단일 스레드 방식으로 한 번에 1,000개 이상의 요청을 처리할 수 있습니다. 프로세스가 완료되면 응답이 마스터로 전송된다. 단일 스레드는 서로 다른 메모리 공간 대신 동일한 메모리 공간에서 작업하므로 RAM과 ROM 크기를 절약할 수 있다. 멀티 스레드는 서로 다른 메모리 공간에서 작업한다.</p>
<h3 id="cache">Cache</h3>
<p>Nginx 캐시는 서버 대신 캐시 메모리에서 데이터를 가져와 페이지를 매우 빠르게 렌더링하는 데 사용된다. 페이지는 첫 번째 요청 시 캐시 메모리에 저장한다</p>
<h2 id="apache-vs-nginx">Apache vs Nginx</h2>
<p>둘 다 정적으로 처리하고 프록시도 제공하고 뭐가 다르냐 흠 ?? </p>
<pre><code>Apache 동기, Nginx 비동기</code></pre><table>
<thead>
<tr>
<th>구분</th>
<th>Apache (동기)</th>
<th>Nginx (비동기)</th>
</tr>
</thead>
<tbody><tr>
<td>요청 처리</td>
<td>요청 1개 → 스레드/프로세스 1개 필요</td>
<td>요청 수천 개도 워커 몇 개가 처리 가능</td>
</tr>
<tr>
<td>방식</td>
<td>Blocking (요청 끝날 때까지 스레드 점유)</td>
<td>Non-blocking (I/O 대기 중에도 다른 요청 처리)</td>
</tr>
<tr>
<td>자원 효율</td>
<td>연결 수만큼 메모리/CPU 소모 ↑</td>
<td>소수 프로세스로 대량 처리 가능</td>
</tr>
<tr>
<td>적합한 곳</td>
<td>소규모 트래픽, 모듈형 동적 처리 (PHP 등)</td>
<td>고트래픽, 리버스 프록시, 정적·API 서버</td>
</tr>
</tbody></table>
<p>물론 Apache에 동작 방식이 요청 한개당 하나의 process 가 먹는게 옛 방식이긴 하지만 그것 때문에 Nginx 가 등장했고 웹 서버가 점점 발전해 간다! </p>
<p>글 읽어주셔 감사합니다 :-&gt;</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Nginx 설치 및 구조]]></title>
            <link>https://velog.io/@dev_yohan/Nginx-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@dev_yohan/Nginx-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Thu, 04 Sep 2025 08:09:56 GMT</pubDate>
            <description><![CDATA[<p>사용자는 ubuntu를 사용 하고 있며, 다른 환경일 경우 조금씩 다를 수 있습니다.</p>
<h1 id="nginx">Nginx</h1>
<h2 id="설치">설치</h2>
<pre><code>sudo apt udpate 
sudo apt install nginx</code></pre><p>보라색이 디렉토리이고 흰색이 파일입니다!
<img src="https://velog.velcdn.com/images/dev_yohan/post/987166c3-60a2-4ba4-857d-887e2e22d5d8/image.png" alt=""></p>
<h2 id="디렉토리">디렉토리</h2>
<h3 id="confd">conf.d</h3>
<p>메인 설정파일(nginx.conf)로 Nginx가 로드 될때 디렉토리 내의 모든 .conf파일을 추가 설정 파일로 인식하고 불러와 로드하는 역할을 한다.  </p>
<h3 id="modules-enabled">modules-enabled</h3>
<p>NGINX 모듈들의 설정 파일이 모여 있는 곳</p>
<h3 id="modules-available">modules-available</h3>
<p>실제로 활성화된 모듈 목록</p>
<p>modules-available에 있는 파일을 여기에 심볼릭 링크로 걸면 모듈이 켜짐.</p>
<h3 id="sites-enabled">sites-enabled</h3>
<p>site-abailable 에서 만든 사이트를 site-enabled/에 추가해야 활성화 됨. site-available에 추가한 사이트를 site-enabled/에 심볼릭 링크하여 사이트를 활성화 할 수 있습니다.</p>
<h3 id="sites-available">sites-available</h3>
<p>사이트 설정 파일이 들어 있는 곳
nginx에서 관리되는 호스트 정보</p>
<h3 id="snippets">snippets</h3>
<p>공통으로 자주 쓰는 문구을 모아두는 폴더
사이트별 설정에서 필요한 부분을 include 할수 있게 모듈화 하는곳 이거는 뒤에 포스팅에 자세히 보여드리도록 하겠습니다!.</p>
<hr>
<p><strong>심볼릭 링크 : 링크를 연결하여 원본 파일을 직접 사용하는 것이다. ex) 웹 naver 아이콘 **
**호스트 : 네트워크에 연결 된 컴퓨터  ex) localhost,127.xxx.xxx.xxx</strong></p>
<h2 id="파일">파일</h2>
<h3 id="nginxconf">nginx.conf</h3>
<p>Nginx가 구동할때 가장 먼저 읽고 구동하기 위한 메인 파일 </p>
<h3 id="proxy_params">proxy_params</h3>
<p>프록시할 때 공통으로 필요한 헤더(Host, IP, 프로토콜 등)를 정리한 파일</p>
<hr>
<p><strong>Proxy : NGINX가 80/443에서 요청을 받고, 내부의 Spring 서버(기본 8080) 로 프록시(넘겨주기)</strong></p>
<p>다음 하나하나 폴더 및 파일을 뜯어보면서 정리하겠습니다! </p>
<p>글 읽어 주셔서 감사합니다! :)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Nginx 란? ]]></title>
            <link>https://velog.io/@dev_yohan/Nginx-%EB%9E%80</link>
            <guid>https://velog.io/@dev_yohan/Nginx-%EB%9E%80</guid>
            <pubDate>Thu, 04 Sep 2025 05:51:57 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_yohan/post/b9acda1b-5ee0-4c39-9a02-c5250378036a/image.png" alt=""></p>
<h1 id="nginx">Nginx</h1>
<h2 id="공식-사이트">공식 사이트</h2>
<p><a href="https://nginx.org">https://nginx.org</a></p>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/741a4411-f302-4b6a-be7b-4963fd6236b1/image.png" alt=""></p>
<p>NGINX(“엔진 엑스”)는 HTTP 웹 서버이자, 리버스 프록시, 콘텐츠 캐시, 로드 밸런서, TCP/UDP 프록시 서버, 그리고 메일 프록시 서버</p>
<p>만든 사람은 아르고 시쇼이브? 라고 나와 있네요</p>
<pre><code>리버스 프록시·로드밸런서·캐시 서버로 동작하는 오픈소스 소프트웨어 </code></pre><h3 id="웹-서버">웹 서버</h3>
<p>클라이언트가 웹 정적 파일(html,css,js,이미지)을 응답 해주는 역활</p>
<ul>
<li>요청마다 스레드를 새로 만드는 게 아니라, 이벤트 루프(Event Loop) 하나가 수천~수만 개 요청을 동시에 관리한다.</li>
</ul>
<ul>
<li>논블로킹 I/O 기반 → 한 요청이 파일 읽기/네트워크 응답을 기다리는 동안 다른 요청도 병렬로 처리 가능하다,</li>
</ul>
<h3 id="리버스-프록시">리버스 프록시</h3>
<p>사용자의 요청을 받아서 내부 애플리케이션 서버(SPRING, Node.js 등) 로 전달하고, 응답을 다시 사용자에게 반환함</p>
<ul>
<li><p>도메인 접근하면 -&gt; ip로 접근한다 이걸 nginx 받아 서버에 전달한다 해서 보안에서 이점을 볼 수 있다.</p>
</li>
<li><p>필요에 따라 기술 스택이 여러가지인 경우 서버를 여러개 놔야할때가 있다. 이런경우 nginx 하나의 도메인으로 여러가지 서버를 통합할수있다.</p>
</li>
</ul>
<h3 id="콘텐츠-캐시">콘텐츠 캐시</h3>
<p>자주 요청되는 정적 자원이나 응답 결과를 캐시에 저장해 두었다가, 다시 요청이 오면 원본 서버로 가지 않고 캐시된 데이터를 바로 제공한다.</p>
<ul>
<li><p>서버 부하가 적어짐</p>
</li>
<li><p>속도 향상</p>
</li>
</ul>
<h3 id="로드-밸런서">로드 밸런서</h3>
<p>클라이언트에 요청이 많을 경우 서버를 분산해서 서버가 죽는걸 방지한다. </p>
<ul>
<li>사용자에게 안정적인 서비스를 제공</li>
</ul>
<h3 id="ssltls-인증">SSL/TLS 인증</h3>
<p>간단히 말해, SSL은 구버전, TLS는 그 업그레이드된 최신 버전이며, HTTPS는 이를 기반으로 한 보안 통신 방식입니다.
만약 HTTP만 사용하면 클라이언트와 서버 간 메시지가 평문(암호화되지 않은 원본 데이터) 으로 전달되어 보안에 취약합니다.
반면 HTTPS를 사용하면 데이터가 암호화된 상태로 전송되므로 도청이나 변조를 방지할 수 있어 훨씬 안전합니다.</p>
<p>글 읽어주셔서 감사합니다! :) </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js  mysql 연동]]></title>
            <link>https://velog.io/@dev_yohan/Node.js-mysql-%EC%97%B0%EB%8F%99</link>
            <guid>https://velog.io/@dev_yohan/Node.js-mysql-%EC%97%B0%EB%8F%99</guid>
            <pubDate>Wed, 03 Sep 2025 02:19:43 GMT</pubDate>
            <description><![CDATA[<h2 id="mysql">mysql</h2>
<h3 id="설치">설치</h3>
<pre><code>npm install mysql2 # mysql 다운로드</code></pre><h3 id="연결">연결</h3>
<p>mysql.createPool() </p>
<p>pool를 사용해서 클라이언트 요청때마다 DB가 연결/끊기가 반복 되면 상당한 리소스가 사용됨으로
그래서 일정한 connection 을 미리 만들어서 재사용 한다.</p>
<ul>
<li>성능향샹의 도움 됨 </li>
</ul>
<h3 id="mysqlcreatepool-사용-방법">mysql.createPool() 사용 방법</h3>
<pre><code class="language-js">const mysql = require(&#39;mysql2/promise&#39;);

const pool = mysql.createPool({
    host: &#39;localhost&#39;,
    user: &#39;root&#39;,
    password: &#39;password&#39;,
    database: &#39;db&#39;,
    waitForConnections: true,
    connectionLimit: 10,
    queueLimit: 0,
    }
)
</code></pre>
<h4 id="waitforconncetions">waitForConncetions</h4>
<p>연결이 다 차 있을 때, 새로운 연결 요청을 어떻게 처리할지 결정
true → 기다린다 (큐에 넣고 대기)
false → 바로 에러 발생 (ER_CON_COUNT_ERROR)</p>
<h4 id="connectionlimit">connectionLimit</h4>
<p>동시에 DB 연결 허용 한번에 요청까지 허용한다.</p>
<h4 id="queuelimt">queueLimt</h4>
<p>connectionLimit에 허용한 connection이 넘어가면 대기 수
0 은 무제한 </p>
<h4 id="예시">예시</h4>
<p>우리가 박재범 콘서트를 티켓팅 한다고 가정해봅시다.<br>사용자가 한 번에 엄청난 connection을 요청하면 서버에 갑자기 큰 부하가 생기게 됩니다.  </p>
<p>이때 <code>connectionLimit</code>을 <strong>1000명</strong>으로 설정하고,<br><code>queueLimit</code>을 <strong>0(무제한 대기)</strong>으로 두면,<br>처음 1000명은 바로 DB에 연결되고,<br>그 외 인원은 connection이 가능해질 때까지 기다리게 됩니다.  </p>
<p>이렇게 하면 서버가 한꺼번에 죽지 않고 안전하게 connection을 관리할 수 있습니다.<br>다만 서버에서도 <strong>DB 서버에 직접 접근</strong>하기 때문에, 성능/부하 관리에 유의해야 한다!</p>
<h4 id="query-사용-및-테스트">query 사용 및 테스트</h4>
<pre><code class="language-js">const pool = require(&#39;../config/mysql&#39;);
// insert query
pool.query(&#39;insert into users(email,password,name,created_at) values(?,?,?,now())&#39;,[email,password,name])

// select query
const [rows]=pool.query(&#39;select * from users&#39;)
res.render(&#39;signup&#39;, { users:rows});
// select 결과를 rows 객체 배열에 담에 전송</code></pre>
<h3 id="결과">결과</h3>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/628812ca-c8a4-4ef1-8049-eb95e29198f4/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/42d1c54f-2613-4711-a135-83c4cd5de2af/image.png" alt=""></p>
<p>다음 글에선 회원가입/로그인 로직구현 및 session으로 user 상태 관리하고 간단하게 password만 암호화 처리 하겠습니다! :) </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Express Router 란 뭘까 ? ]]></title>
            <link>https://velog.io/@dev_yohan/Express-Router</link>
            <guid>https://velog.io/@dev_yohan/Express-Router</guid>
            <pubDate>Tue, 02 Sep 2025 22:29:12 GMT</pubDate>
            <description><![CDATA[<p>node.js 를 사용하면서 Express라는 웹 프레임워크를 사용 할려고한다. 인텔리제이에서 제공하는 설명 덕분에 코드는 조금 더러워 보이지만 파리미터에 대한 자세한 내용을 잘 보여줘서 새로운 언어를 시작하는데 앞서 도움이된다! </p>
<h1 id="express">Express</h1>
<h2 id="개념">개념</h2>
<p>Node.js 기반의 웹 애플리케이션 프레임워크, node.js 에서 http 서버를 직접 만들 수 있지만 코드가 길어지고 불편함 때문에 많은 곳에서 채택함</p>
<h3 id="express-x">express (x)</h3>
<pre><code class="language-js">const http = require(&#39;http&#39;);
const url = require(&#39;url&#39;);

const server = http.createServer((req, res) =&gt; {
  const parsedUrl = url.parse(req.url, true);

  if (req.method === &#39;GET&#39; &amp;&amp; parsedUrl.pathname === &#39;/users&#39;) {
    res.writeHead(200, { &#39;Content-Type&#39;: &#39;application/json&#39; });
    res.end(JSON.stringify({ message: &quot;User list&quot; }));
  } else if (req.method === &#39;POST&#39; &amp;&amp; parsedUrl.pathname === &#39;/users&#39;) {
    res.writeHead(200, { &#39;Content-Type&#39;: &#39;application/json&#39; });
    res.end(JSON.stringify({ message: &quot;User created&quot; }));
  } else {
    res.writeHead(404, { &#39;Content-Type&#39;: &#39;text/plain&#39; });
    res.end(&quot;Not Found&quot;);
  }
});

server.listen(3000, () =&gt; {
  console.log(&quot;Server running at http://localhost:3000&quot;);
});</code></pre>
<h3 id="exrpess-o">exrpess (o)</h3>
<pre><code class="language-js">const express = require(&#39;express&#39;);
const app = express();

app.use(express.json()); // JSON 파싱 미들웨어

// GET /users
app.get(&#39;/users&#39;, (req, res) =&gt; {
  res.json({ message: &quot;User list&quot; });
});

// POST /users
app.post(&#39;/users&#39;, (req, res) =&gt; {
  res.json({ message: &quot;User created&quot; });
});

// 404 처리
app.use((req, res) =&gt; {
  res.status(404).send(&quot;Not Found&quot;);
});

app.listen(3000, () =&gt; {
  console.log(&quot;Express server running at http://localhost:3000&quot;);
});</code></pre>
<hr>
<h2 id="아키텍처">아키텍처</h2>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/ac19e3b5-81a0-4c81-9c28-d5ee29dd5d15/image.png" alt=""></p>
<p>출처 : MDN
<a href="https://developer.mozilla.org/en-US/docs/Learn_web_development/Extensions/Server-side/Express_Nodejs/routes">https://developer.mozilla.org/en-US/docs/Learn_web_development/Extensions/Server-side/Express_Nodejs/routes</a></p>
<ol>
<li>클라이언트가 /user,/login,/signup 등 요청을 보낸다.</li>
<li>Routes 가 받아 Controller 매핑 해주는 역활이다.</li>
<li>db 에 접근해서 읽고 쓰기를 한다.</li>
<li>Controller에게 다시 보내주며 응답에 view 를 꾸며준다.</li>
</ol>
<h1 id="사용방법">사용방법</h1>
<h2 id="mdn-공식문서">mdn 공식문서</h2>
<pre><code class="language-js">// wiki.js - Wiki route module.

const express = require(&quot;express&quot;);
// express import
const router = express.Router();
// express 참조해서 Router 가져옴
// Home page route.
router.get(&quot;/&quot;, (req, res) =&gt; {
  res.send(&quot;Wiki home page&quot;);
});
// 리소스 &quot;/&quot; 접근해서 req = request, res = response 
// 응답을 보낸다 &quot;wiki home page&quot;

// About page route.
router.get(&quot;/about&quot;, (req, res) =&gt; {
  res.send(&quot;About this wiki&quot;);
});

module.exports = router;</code></pre>
<h2 id="인텔리제이-기본-세팅">인텔리제이 기본 세팅</h2>
<pre><code class="language-js">var express = require(&#39;express&#39;);
var router = express.Router();

/* GET home page. */
router.get(&#39;/&#39;, function(req, res, next) {
  res.render(&#39;index&#39;, { title: &#39;Express&#39; });
});


module.exports = router;
</code></pre>
<h2 id="의문점-🤔">의문점 🤔</h2>
<p>쓰는것은 비슷해보이는데 render 와 send 는 무슨 차이일까 ?</p>
<h3 id="send-와-render-차이점">send 와 render 차이점</h3>
<table>
<thead>
<tr>
<th>메서드</th>
<th>설명</th>
<th>Spring 개념</th>
<th>예시</th>
</tr>
</thead>
<tbody><tr>
<td><code>res.send()</code></td>
<td>데이터 자체를 응답 (문자열, JSON, HTML 조각)</td>
<td><code>@RestController</code> + <code>ResponseEntity</code></td>
<td><code>res.send({id:1})</code></td>
</tr>
<tr>
<td><code>res.render()</code></td>
<td>템플릿(Views)을 HTML로 변환해서 응답</td>
<td><code>@Controller</code> + JSP/Thymeleaf</td>
<td><code>res.render(&quot;index&quot;, {user:&quot;yohan&quot;})</code></td>
</tr>
</tbody></table>
<p>그래서 view가 있는 인텔리제이에서 render를 사용했구나! </p>
<hr>
<p>글 읽어주셔서 감사합니다! : )</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js 디렉토리 구조]]></title>
            <link>https://velog.io/@dev_yohan/Node.js-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@dev_yohan/Node.js-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Tue, 02 Sep 2025 20:28:57 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_yohan/post/595de087-bed0-4981-9c42-54939900ea92/image.png" alt=""></p>
<h2 id="idea">.idea</h2>
<p>인텔리제이에서 만들어서 idea 디렉토리가 생겼네요 다른 툴마다 다 다름</p>
<h2 id="bin">bin</h2>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/afc4ae8c-943b-44f0-ad43-212e388ef0ed/image.png" alt=""></p>
<ul>
<li>www 파일에 서버관련 실행 및 내용이 있음 </li>
</ul>
<p>서버 실행시 app.js 파일을 가져와서 실행</p>
<h2 id="public">public</h2>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/743912cb-4ba2-4377-89a5-206fe2662542/image.png" alt=""></p>
<p>정적 파일 관리 해주는곳 java에서 resouces/static 와 비슷함 </p>
<h2 id="routes">routes</h2>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/79c21bcc-639b-4b37-a5b9-f699e378e550/image.png" alt=""></p>
<p>리소스(URL 요청)에 대한 로직을 처리하는 부분
spring에 controller 와 비슷함 </p>
<h2 id="views">views</h2>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/c57d539a-b0a8-4785-bdca-99c381521da4/image.png" alt=""></p>
<p>서버에서 동적으로 HTML을 만들어 클라이언트에 응답할 때 사용
spring 에서 WEB-INF/views (JSP) 비슷함 </p>
<h2 id="appjs">app.js</h2>
<p>Express의 메인 설정 허브</p>
<ul>
<li>미들웨어 등록</li>
<li>뷰 엔진 설정</li>
<li>라우터 등록</li>
<li>에러 처리</li>
</ul>
<h2 id="packagejson">package.json</h2>
<p>전에 npm 명령어로 내가 다운받은 의존성과 실행 명령어문 등 있음
spring에서 build.gradle,pom.xml 비슷함 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js 자주 쓰는 용어]]></title>
            <link>https://velog.io/@dev_yohan/Node.js-%EC%9E%90%EC%A3%BC-%EC%93%B0%EB%8A%94-%EC%9A%A9%EC%96%B4</link>
            <guid>https://velog.io/@dev_yohan/Node.js-%EC%9E%90%EC%A3%BC-%EC%93%B0%EB%8A%94-%EC%9A%A9%EC%96%B4</guid>
            <pubDate>Tue, 02 Sep 2025 00:48:25 GMT</pubDate>
            <description><![CDATA[<p>Node.js 를 무턱대고 시작하면 용어 정리 및 개념 부족한데 그래도 자주 쓰는 용어라도 정리해야
&quot;아! 이 사람이 이렇게 말했던게 이거구나&quot; 이런식으로 라도 이해하는데 도움이 될거 같아서 정리를 해봅니다!</p>
<h1 id="용어-정리">용어 정리</h1>
<h3 id="모듈module">모듈(Module)</h3>
<p>코드를 단위 처럼 쪼개진것 
ex) 우리가 header 및 footer 처럼 다른 페이지 파일을 가져다가 쓰는것</p>
<h3 id="npm-node-package-manager">npm (Node Package Manager)</h3>
<p>node 에서 공식적으로 지원하는 패키지 관리</p>
<h3 id="미들웨어middleware">미들웨어(Middleware)</h3>
<p>Express에서 요청(req)과 응답(res) 사이에 실행되는 함수</p>
<h3 id="라우팅routing">라우팅(Routing)</h3>
<p>클라이언트 요청 즉 리소스(URL)에 대해서 기능을 정의하는것</p>
<h3 id="콜백callback--프로미스promise--asyncawait">콜백(Callback) / 프로미스(Promise) / async/await</h3>
<ul>
<li><p>Callback: 비동기의 가장 기본 (구식, 지옥 발생)</p>
</li>
<li><p>Promise: 체계적인 비동기 관리 (then/catch)</p>
</li>
<li><p>Async/Await: 가장 현대적인 방식, 코드가 깔끔</p>
</li>
</ul>
<h3 id="이벤트-루프event-loop">이벤트 루프(Event Loop)</h3>
<p>요청이 들어오면 바로 응답하지 않고, 이벤트 큐에 넣고 나중에 처리</p>
<p>차후 아키텍처로 자세히 글을 작성할 예정</p>
<h3 id="express">Express</h3>
<p>프레임 워크 이며 라우팅, 미들웨어, 요청/응답 처리 기능을 제공</p>
<hr>
<p>react 를 공부하면서 조금 씩 찾아봤던게 많아서 다행이네요 </p>
<p>글 읽어 주셔서 감사합니다.  :) 
오늘도 파이팅 bb 
다음 글에선 어제 실행만해본 node.js에 디렉토리 구조를 작성하겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[인텔리제이에서 node.js 세팅]]></title>
            <link>https://velog.io/@dev_yohan/%EC%9D%B8%ED%85%94%EB%A6%AC%EC%A0%9C%EC%9D%B4%EC%97%90%EC%84%9C-node.js-%EC%84%B8%ED%8C%85</link>
            <guid>https://velog.io/@dev_yohan/%EC%9D%B8%ED%85%94%EB%A6%AC%EC%A0%9C%EC%9D%B4%EC%97%90%EC%84%9C-node.js-%EC%84%B8%ED%8C%85</guid>
            <pubDate>Mon, 01 Sep 2025 05:30:59 GMT</pubDate>
            <description><![CDATA[<h1 id="node-버전-확인">Node 버전 확인</h1>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/2cfb9db7-67bf-4b15-acdb-ed915dd82bda/image.png" alt=""></p>
<hr>
<h1 id="인텔리제이">인텔리제이</h1>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/334f2139-1cfb-42ed-aa75-2129f525b3c1/image.png" alt=""></p>
<hr>
<ol>
<li>Express</li>
<li>view Engine  EJS</li>
<li>create 클릭  </li>
</ol>
<h1 id="실행">실행</h1>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/3337c7f1-6d8a-4edc-b0da-36563115973a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/a0cd9663-4fb8-4368-a26c-27fc93473148/image.png" alt=""></p>
<p>일단 된거 같네요! </p>
<p>글 읽어주셔서 감사합니다 :) </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js 시작 ? ]]></title>
            <link>https://velog.io/@dev_yohan/Node.js-%EC%8B%9C%EC%9E%91</link>
            <guid>https://velog.io/@dev_yohan/Node.js-%EC%8B%9C%EC%9E%91</guid>
            <pubDate>Mon, 01 Sep 2025 05:11:51 GMT</pubDate>
            <description><![CDATA[<p>흠.. 
스타트업 대표님과 만나서 대화 할 수 있는 기회가 생겼다. 
기술 스택으로 node.js 와 ts 기반으로 설계되어 있었다.
나는 java기반에 spring으로 프로젝트를 이어 나갔었다. 그래서 왜 node.js 랑 ts 를 선호하시는지는 여줘보았는데 아무것도 모르는 나는 끄덕거리기만 했다. 
개발자라면 새로운 기술에 두려워 하지말고 계속 해서 공부해나가는것! 그래서 node 도 꾸준히 글을 쓰면서 공부 할예정입니다.</p>
<h1 id="nodejs-란">Node.js 란</h1>
<pre><code>확장자가 js 이며 V8엔진 기반으로 javascript로 서버 런타임 환경을 구축 한다.</code></pre><h2 id="장점">장점</h2>
<ol>
<li>높은 처리량(Throughput)</li>
</ol>
<ul>
<li>논블로킹 I/O + 이벤트 루프로 I/O-bound 트래픽을 매우 효율적으로 처리한다.</li>
<li>컨텍스트 스위칭이 적고 콜백/프로미스 기반으로 동시 연결을 가볍게 유지한다.</li>
</ul>
<ol start="2">
<li>확장성(Scalability)</li>
</ol>
<ul>
<li>단일 이벤트 루프 + libuv 스레드풀 구조로 많은 동시 요청을 처리합니다.</li>
</ul>
<ol start="3">
<li>풍부한 모듈 생태계(npm)</li>
</ol>
<ul>
<li>세계 최대 규모의 패키지 레지스트리로, 필요한 기능을 빠르게 도입 가능.</li>
<li>커뮤니티 기여가 활발해 업데이트/대체재 선택 폭이 넓음. (패키지 품질·보안 검증은 필수)</li>
</ul>
<ol start="4">
<li>빠른 개발 속도</li>
</ol>
<ul>
<li>프론트/백 모두 JavaScript/TypeScript로 통일 - 이거 좋은듯 ㅎㅎ</li>
<li>비동기 기본기가 언어/런타임에 녹아 있어 네트워크/파일 I/O 로직이 간결합니다.</li>
</ul>
<ol start="5">
<li>생산성 도구 &amp; 프레임워크</li>
</ol>
<ul>
<li>Express / Nest로 웹 API를 신속하게 구축.</li>
<li>Mongoose/Prisma 등으로 DB 상호작용 단순화.</li>
</ul>
<h2 id="단점">단점</h2>
<ol>
<li>비동기 처리로 callback 지옥 </li>
</ol>
<p>Node.js는 비동기 처리 아키텍처 덕분에 빠른 응답이 가능하지만, 콜백 함수가 중첩되는 ‘콜백 지옥(Callback Hell)’ 문제가 발생할 수 있다. 이는 코드의 가독성과 유지보수를 어렵게 만든다.”</p>
<ol start="2">
<li>메모리 누수 -  단일 쓰레드 </li>
</ol>
<ul>
<li>java JVM 내부에 GC 에서 메모리 상태를 관리해주는다.</li>
<li>node 런타임 자체가 가볍고 단일 스레드 구조라, 대규모 메모리 관리에는 한계가 있다</li>
</ul>
<h2 id="후기">후기</h2>
<p>java로만 spring 프레임워크만 개발하다 node공부하면 리팩토링 빨리 하고싶단 생각에 심장이 뛰네요!! </p>
<p>글 읽어주셔서 감사합니다 :)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[리눅스 폴더 권한 설정 (chmod / chown)]]></title>
            <link>https://velog.io/@dev_yohan/%EB%A6%AC%EB%88%85%EC%8A%A4-%ED%8F%B4%EB%8D%94-%EA%B6%8C%ED%95%9C-%EC%84%A4%EC%A0%95-chmod-chown</link>
            <guid>https://velog.io/@dev_yohan/%EB%A6%AC%EB%88%85%EC%8A%A4-%ED%8F%B4%EB%8D%94-%EA%B6%8C%ED%95%9C-%EC%84%A4%EC%A0%95-chmod-chown</guid>
            <pubDate>Sun, 24 Aug 2025 22:05:45 GMT</pubDate>
            <description><![CDATA[<h1 id="사건의-시작">사건의 시작....</h1>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/71eecd08-725d-457b-980b-1613a56247c2/image.png" alt=""></p>
<p>룰루랄라 이제 방화벽도 해결했고 서버도 잘 올라가고 postman으로도 요청이 잘 올라가네 이러고 저장을 할려고했는데 .. Post로 저장하는걸 요청했는데 오류가 떠서 후다닥 프로젝트 폴더 들어가서 tail -f app.log 로 내가 실행 한 내용보는데 허가 불가가 뜬다... ㅠㅠ </p>
<p>조금 찾아보니 프로젝트가 이미지를 저장할려는데 opt 아래 디렉토토리는 쓰기 권한이 root계정만 권한 만 접근가능하다고 하네요 ... 이것도 모르고 설정 먼저 안하고 후다닥 log 부터 확인 </p>
<hr>
<h2 id="초긍정-마인드">초긍정 마인드..</h2>
<p>뭐 이참에 리눅스 명령어도 더 공부하고 조금 더 알아서 리눅스 마스터 때 편하게 시험보면되겠죵! </p>
<h2 id="리눅스-디렉토리">리눅스 디렉토리</h2>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/9f06d5d6-d55d-459f-997e-19158e888b37/image.png" alt=""></p>
<p>사진 출처
<a href="https://jinwoo1990.github.io/dev-wiki/linux-directory/">https://jinwoo1990.github.io/dev-wiki/linux-directory/</a></p>
<h3 id="bin">/bin</h3>
<p>이름에서 알 수 있듯이 binaries 디렉토리로 이전 파일로 기본적인 명령어가 저장되는 디렉토리이다. 우리 사용하는 명령어가 /bin 디렉토리에 저장되어 있다</p>
<h3 id="sbin">/sbin</h3>
<p>system + bin 디렉토리로 이것 또한 bin 폴더 랑 별개로 시스템과 관련된 명령어어가 저장되어있다. </p>
<h3 id="home">/home</h3>
<p>우리가 접속을 하게 되면 사용자 별로 계정이 있을 것이다. 그러면 /home/guestA, /home/guestB 안에 개별 폴더를 사용해서 권한을 설정해
서 접속하고 작업하는게 원칙이다</p>
<h3 id="tmp">/tmp</h3>
<p>임시 파일을 저장하기 위한 디렉토리, 재부팅시 삭제되며정기적을 10일 정도 간격으로 삭제된다. </p>
<h3 id="lib">/lib</h3>
<p>라이브러리 디렉토리로 OS 커널에 필요한 라이브러리 파일, 커널 모듈이등이 존재한다. </p>
<h3 id="usr">/usr</h3>
<p>사용자 들이 사용하는 디렉토리이다.이러면 /home/geust 랑 뭔차이인가 ? 하면 접속 하는 모든 사용자들이 사용가능한 폴더 이다 특정 사용자랑은 조금 다른 특성이다.</p>
<h3 id="var">/var</h3>
<p>var 기타 모든 다용도로  사용 할 수 있으면 웹 서버 이미지 등을 사용가능하다. 전역으로 사용가능하다.</p>
<p>다른 글들 많이 찾아보니까 var 에 이미지를 저장하더라고요 ㅎㅎ;; 작성자는 이글 작성하다가 properties 내용변경하고 var 하위 디렉토리를 만들었다는 사실..</p>
<h2 id="권한-변경">권한 변경</h2>
<h3 id="소유권-vs-파일-권한">소유권 vs 파일 권한</h3>
<h3 id="소유권-chageowner">소유권 (chage+owner)</h3>
<pre><code class="language-xml">chown [옵션] [새로운소유자][:새로운그룹] 대상파일/디렉토리
sudo chown yohan app.log 
#app.log 를 소유자를 yohan으로 변경 </code></pre>
<h3 id="파일-권한-chagemode">파일 권한 (chage+mode)</h3>
<pre><code class="language-xml">chmod [옵션] [권한] 대상
chmod rw------- ~/Desktop/rsa_id 
# 이거는 aws 썻을때 .pem 키 받았을때 봤던거 같네요 ㅎㅎ</code></pre>
<h2 id="대상">대상</h2>
<p>u: user 소유자 
g: group 그룹
o: others 기타 사용자 
a: all 전체 (u+g+o)</p>
<h2 id="연산자">연산자</h2>
<p>+: 권한 추가 
-: 권한 제거 
=: 권한 지정 </p>
<h2 id="권한">권한</h2>
<p>r: read 읽기 
w: write 쓰기 
x: execute 실행</p>
<h3 id="예시">예시</h3>
<pre><code class="language-vim">chmod u+x /tomcat/bin/start.sh
# user 에게 tomcat/bin 폴더에 start.sh 스크립트 실행 권한 줌</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[git Action -  spring CICD 구축]]></title>
            <link>https://velog.io/@dev_yohan/git-Action-spring-CICD-%EA%B5%AC%EC%B6%95</link>
            <guid>https://velog.io/@dev_yohan/git-Action-spring-CICD-%EA%B5%AC%EC%B6%95</guid>
            <pubDate>Tue, 19 Aug 2025 12:18:24 GMT</pubDate>
            <description><![CDATA[<h1 id="cicd-세팅">CICD 세팅</h1>
<h2 id="cd-세팅">CD 세팅</h2>
<h3 id="준비-사항">준비 사항</h3>
<p>깃허브 아이디 및 리포지토리
서버 접근 키 → ssh key (접속 권한 필수)
빌드된 프로젝트 → jar 또는 war 파일</p>
<h3 id="명령어">명령어</h3>
<p>프로젝트 올릴 때 → scp
서버 접속할 때 → ssh
실행할 때 → java -jar xxx.jar
서버 → 배포 환경이 준비된 Ubuntu 리눅스 서버</p>
<h2 id="1-github-세팅">1. github 세팅</h2>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/fba7ea85-45a9-4609-9d36-d32dfa7e88e7/image.png" alt=""></p>
<ul>
<li>리포지토리 setting Secrets and variables </li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/9abc0711-169e-4a70-ad50-2f10993a3e8f/image.png" alt="">
이런 창이 나올텐데 new Repository secret 클릭! </p>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/e377ae41-782a-4d9c-94e5-412e6b4ff5c7/image.png" alt=""></p>
<ul>
<li>APP_PATH : 프로젝트 경로</li>
<li>SSH_HOST : 서버 public IP</li>
<li>SSH_KEY : 서버 접근 키 (SSH 키)</li>
<li>SSH_USER 
  AWS EC2 → ubuntu
  집 리눅스 서버 → 네 계정 이름</li>
</ul>
<p>서버 접근할때 명령어 
ssh -i <SSH_KEY> <SSH_USER>@<SSH_HOST></p>
<h2 id="이거를-어떻게-가져올까-">이거를 어떻게 가져올까 ?</h2>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/322b8c68-230e-4d7e-ae84-ee26232734c1/image.png" alt="">
참고 <a href="https://docs.github.com/ko/actions/concepts/workflows-and-actions/workflows">https://docs.github.com/ko/actions/concepts/workflows-and-actions/workflows</a>
2 번에 일단 .github/workflows라고 파일들을 찾을 수 있다고 하네요 
<img src="https://velog.velcdn.com/images/dev_yohan/post/2f2f9bc4-2ab1-48e5-bb8e-3f7bf87cfe93/image.png" alt=""></p>
<p>생성하면 , 일단 인식을 잘하는거 같네요  ㅎㅎ</p>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/24fd03bc-c628-4646-9de8-8ebe3c1f953b/image.png" alt=""></p>
<p>yml로 작성 해야해서 킹 받긴한데 뭐 가이드라인이 이러는데 어떻게 하겠어요 ㅠㅠ</p>
<p>on : 트리거 -&gt; 내가 어떤 작업을 할때 작동됨 
push : git에서 push 를 할때 
branches : 지금 브랜치 대부분 개발단계랑 main이랑 사용됨 저는 main 만 할꺼에용!
<img src="https://velog.velcdn.com/images/dev_yohan/post/67b87ae8-db44-489f-bb81-7f341f08e004/image.png" alt="">
-&gt; git push origin main 일때 트리거 발동 </p>
<p>빠르게 세팅 하고 최적화 해서 포스팅 이어가겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[CI/CD 란  ]]></title>
            <link>https://velog.io/@dev_yohan/CICD-%EB%9E%80</link>
            <guid>https://velog.io/@dev_yohan/CICD-%EB%9E%80</guid>
            <pubDate>Sun, 17 Aug 2025 20:33:03 GMT</pubDate>
            <description><![CDATA[<h1 id="cicd란-">CICD란 ?</h1>
<h2 id="cicontinuous-integration">CI(Continuous Integration)</h2>
<h3 id="지속적인-통합">지속적인 통합</h3>
<p>왜 CI 가 필요 할까 ?
대부분 깃허브(통합 저장소)를 사용해서 다른 브랜치를 통해 서로가 만든 코드를 dev(개발 단계), main(실제 서비스 단계) 브랜치로 관리하고 조금 
더 세분화 시키면 내가 짠코드는 yohan이라는 브랜치에 코드를 저장한다.</p>
<p>이때 서로 다른 <strong>브랜치</strong> <strong>병합(merge)</strong> 하는 과정에서 문제가 많이들 발생한다. 이것을 방지 하고자 CI 파이프라인이 사용된다.</p>
<p>그리고 또한 모든 커밋 과정에서 테스트 실행으로 코드 품질에 유리하다. 
이렇게 테스트 실행시 실패하면 <strong>빠르게 오류</strong>를 수정 할 수 있고 <strong>동기화</strong>된 코드를  공유 하는것이 장점이다. </p>
<hr>
<h3 id="장점">장점</h3>
<ol>
<li>코드 품질 보장</li>
<li>개발 속도 향상 </li>
<li>서비스 안정성 확보<h2 id="cdcontinuous-delivery">CD(Continuous Delivery)</h2>
<h3 id="지속적-배포">지속적 배포</h3>
위에 CI가 코드 품질을 보장하는 단계라면, 이제 남은 건 이 코드를 실제 서버에 올리는 일이다.
사실 예전에는 우리가 scp 명령어나 직접 ssh 접속해서 build 하고 배포해야 했다. 이 과정은 시간도 오래 걸리고 실수 위험도 크다.</li>
</ol>
<p>이 문제를 해결하기 위해 CD 파이프라인을 사용한다.
CD를 통해 테스트까지 끝난 코드를 자동으로 서버에 배포할 수 있다. 사람이 일일이 서버에 들어가지 않아도, 코드가 검증되는 순간 바로 서비스에 반영되는 것이다.</p>
<h3 id="장점-1">장점</h3>
<ol>
<li>배포 자동화</li>
<li>실수 최소화</li>
<li>빠른 배포 </li>
<li>안정성 확보 </li>
</ol>
<hr>
<h2 id="cicd-개발도구">CICD 개발도구</h2>
<p>AWS, Jenkins, gitAction 3가지 개발 환경에 따라 자기에 맞는 도구를 선택하시면 될거 같습니다! 저는 aws를 사용하지 않고 리눅스로 서버 구축및 포트포워딩도 해놓은 상태라서 gitAction 을 사용해서 CICD 구축을 진행하겠습니다!</p>
<hr>
<p>솔직히 예전 프로젝트 때는 CI/CD를 구축하지 않고 진행했다.
그래서 새벽 2시 30분부터 4시 반까지 서버에 코드를 직접 올리고, 항상 쓰던 scp 명령어와 tomcat의 bin 폴더에서 ./start.sh를 실행해야 했다.
이 과정을 반복하다 보니, “아… 이게 바로 자동화가 필요한 이유구나” 하고 뼈저리게 느꼈다.
뭐! 이전 프로젝트때 노가다 했으니까 CICD 구축할때도 도움도 되겠죠? </p>
<p><strong>이후 글에는 git Action 을 통해 CI/CD 구축 해보겠습니다!</strong></p>
<p>긴 글 읽어 주셔서 감사합니다! :) </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Swagger - spring 기초 적용]]></title>
            <link>https://velog.io/@dev_yohan/Swagger-spring-%EC%A0%81%EC%9A%A9</link>
            <guid>https://velog.io/@dev_yohan/Swagger-spring-%EC%A0%81%EC%9A%A9</guid>
            <pubDate>Sun, 20 Jul 2025 18:31:05 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_yohan/post/2119ecc4-967a-4ff1-95c1-5c62527b2bc4/image.png" alt=""></p>
<p>Swagger 사이트 : <a href="https://swagger.io/">https://swagger.io/</a></p>
<h1 id="swagger">Swagger</h1>
<h2 id="swagger란">Swagger란</h2>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/b983bb1f-8679-4559-8785-33c3dc125f68/image.png" alt=""></p>
<p>Swagger에서 제공하는 오픈소스와 전문가용 도구로 API 문서를 쉽게 만들 수 있어 , 당신과 팀이 API를 효율적으로 설계하고 문서화하는 데 도움이 된다고 하네요.</p>
<p>위에 이미지 오른쪽 부분에 옛날에 공공데이터 사용할때 본거 같은데 친숙하네요 ㅎㅎ</p>
<h2 id="사용-이유">사용 이유</h2>
<p>위에 저의 하찮은 영어 실력이유가 설명이 조금 되었지만 back-end 와 front-end가 서버를 따로 두는 경우가 있어 프로젝트 협업이 전보다는 구체적으로 api 명세서가필요한 경우가 있다. 이처럼 swagger를  사용하게 되면 편리하게 api 명세서를 확인 할 수 있다. 서로 <strong>winwin</strong> ㅎㅎ</p>
<h2 id="사용법">사용법</h2>
<p>조금 힘들지만 공식 문서 보고 적용해보겠습니다!</p>
<h3 id="0-httpsspringdocorg---접속">0. <a href="https://springdoc.org/">https://springdoc.org/</a> &lt;- 접속</h3>
<h3 id="1-소개">1. 소개</h3>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/94b50d33-ebbe-4180-9dd9-044bb826c068/image.png" alt=""></p>
<p>swagger 사용처가 여기 나와있네요 .. 한참을 찾았네 </p>
<h3 id="2-설정">2. 설정</h3>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/6a8be1f9-e430-4a01-b1a3-ad4c0d5fdfd4/image.png" alt=""></p>
<h4 id="maven">maven</h4>
<pre><code class="language-xml">&lt;!-- https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webmvc-ui --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.springdoc&lt;/groupId&gt;
    &lt;artifactId&gt;springdoc-openapi-starter-webmvc-ui&lt;/artifactId&gt;
    &lt;version&gt;2.8.9&lt;/version&gt;
&lt;/dependency&gt;</code></pre>
<h4 id="gradle">gradle</h4>
<pre><code class="language-xml">// https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webmvc-ui
implementation(&quot;org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.9&quot;)</code></pre>
<p>gradle은 안보여서 mavenRepository에서 가져왔습니다.</p>
<h4 id="properties">properties</h4>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/9f223e5e-91b9-4f09-afcd-cbf35795f1ef/image.png" alt="">
<img src="https://velog.velcdn.com/images/dev_yohan/post/b87001e2-7cd4-42c6-94c5-79a387105381/image.png" alt=""></p>
<h3 id="4-7">4-7</h3>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/60bed17a-67db-48c3-9cc8-eb506fb22f06/image.png" alt="">
여기에 apiResponse 있는거보면 이거인거같은데 RouterOperation도 있고 한번해보면 알겠네요... 해봅시다  </p>
<h3 id="method">method</h3>
<pre><code class="language-java">@GetMapping(&quot;/hello&quot;)
    @Operation(summary  = &quot;한눈의 들어오는 한줄요약 느낌 ?&quot;,description = &quot;간단한 설명&quot;)
    public HttpEntity&lt;String&gt; helloGet() {
        return new HttpEntity&lt;&gt;(&quot;hello&quot;);
    }</code></pre>
<h3 id="schema">Schema</h3>
<p>간단하죠! :)</p>
<h2 id="결과">결과</h2>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/a703d9f0-588d-4851-9d7f-bea20e14a723/image.png" alt=""></p>
<h2 id="미완성-글-ㅠㅠ">미완성 글 ㅠㅠ</h2>
<p>다음 글에선 security + restControllerAdvice 사용법이 있나 찾아볼께요 ~ </p>
<p>글 읽어주셔서 감사합니다.  :) </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[방화벽]]></title>
            <link>https://velog.io/@dev_yohan/%EB%B0%A9%ED%99%94%EB%B2%BD</link>
            <guid>https://velog.io/@dev_yohan/%EB%B0%A9%ED%99%94%EB%B2%BD</guid>
            <pubDate>Sun, 20 Jul 2025 17:52:19 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_yohan/post/d12a3a2d-21b0-4845-9826-6bfd370c516e/image.png" alt="">
이미지 출처 - <a href="https://blog.naver.com/pgh7092/221148632964">https://blog.naver.com/pgh7092/221148632964</a></p>
<h1 id="방화벽-firewall">방화벽 (Firewall)</h1>
<h2 id="방화벽이란-">방화벽이란 ?</h2>
<p>우분투에서 방화벽 관련 명령어를 치면서 그래서 방화벽이 정확히 무슨역활하고, 어떤 걸 제공할까 ? 이라는 생각에 글을 작성하게되었습니다.
firewall 방화/벽 단어로 이러진거 같아서 불 났을때 벽이 그 불을 막듯이 네트워크상에 외부로 부터 막는 역활을 하는거 같아요! 설명하기 전에 RAN 과 WAN이 개념 및 차이점은 간단하게 알아야하겠죵! </p>
<h3 id="ran-local-area-network">RAN (Local Area Network)</h3>
<ol>
<li>집이나 회사 통신망(private IP, 사설 IP)</li>
<li>내부망에서만 사용 가능 <h3 id="wan-wide-area-network">WAN (Wide Area Network)</h3>
<ol>
<li>전 세계에서 유일한 IP(public IP, 공인 IP) </li>
<li>인터넷에서 유일한 주소</li>
<li>웹 사이트 개설 사이트 접속 IP</li>
</ol>
</li>
</ol>
<p>역시 사진으로 봐야겠죠??!! </p>
<h4 id="lan-접속">LAN 접속</h4>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/0e5d540e-34f1-41b4-b4c6-eb94859ec04a/image.png" alt="">
이거는 사설 IP에선 집 wife를 사용하고 있어서 접속이 가능하지만 외부에선 접속이 안됩니다! </p>
<h4 id="wan-접속">WAN 접속</h4>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/a0a6dc89-fea2-4837-a0a7-29ab5a38681c/image.png" alt=""></p>
<p>제 공인 IP는 외부 사람들도 접속해서 확인 가능합니다! </p>
<p>참고 자료 - dev_yohan 벨로그</p>
<p><a href="https://velog.io/@dev_yohan/Ubuntu-%EC%84%9C%EB%B2%84%EA%B5%AC%EC%B6%95-spring-jar%ED%8C%8C%EC%9D%BC">https://velog.io/@dev_yohan/Ubuntu-%EC%84%9C%EB%B2%84%EA%B5%AC%EC%B6%95-spring-jar%ED%8C%8C%EC%9D%BC</a></p>
<hr>
<p>좋아요! 방화벽을 LAN과 WAN 사이에서 중재자처럼 설정하고, 내부(LAN)는 자유롭게, 외부(WAN)는 통제되도록 설정하는 건 보안의 기본이자 가장 중요한 부분입니당~</p>
<h3 id="주요-기능">주요 기능</h3>
<ol>
<li>접근 통제(Access Control/(인바운드/아웃바운드))</li>
</ol>
<ul>
<li>허용된 서비스나 전자우편 서버, 공개정보 서버와 같은 특정 호스트를 제외하고는, 외부에서 내부 네트워크에 접속하는 것을 패킷 필터링(Packet Filtering), 프록시(Proxy) 방식 등으로 접근을 통제하는 기능.</li>
</ul>
<ol start="2">
<li>인증(Authentication)</li>
</ol>
<ul>
<li>메시지 인증 : VPN과 같은 신뢰할 수 있는 통신선을 통해 전송되는 메시지 신뢰성 보장</li>
<li>사용자 인증 : 방화벽을 지나가는 트래픽에 대한 사용자가 누군지에 대해 증명하는 기능
(OTP, 토큰기반 인증, 패스워드 인증 등)</li>
<li>클라이언트 인증 : 모바일 사용자처럼 특수한 경우에 접속을 요구하는 호스트에 대해 인가된 호스트인지 확인</li>
</ul>
<ol start="3">
<li>감사 및 로그 기능(Auditing / Loggging)</li>
</ol>
<ul>
<li>정책 설정 및 변경, 관리자 접근, 네트워크 트래픽 허용 또는 차단과 관련한 사항 등 접속 정보를 로그로 남김</li>
</ul>
<ol start="4">
<li>프라이버시 보호 (Privacy Protection)</li>
</ol>
<ul>
<li>이중DNS(Dual Domain Name System), 프록시(Proxy) 기능, NAT 기능 등을 제공함으로써 내부 네트워크와 외부 네트워크 간의 중개자 역할을 함으로써 내부 네트워크의 정보 유출을 방지함</li>
</ul>
<ol start="5">
<li>서비스 통제(Service Control)</li>
</ol>
<ul>
<li>안전하지 못하거나 위험성이 존재하는 서비스를 필터링함으로써 내부 네트워크의 호스트가 가지고 있는 취약점을 감소시킴</li>
</ul>
<ol start="6">
<li>데이터 암호화(Data Encryption)</li>
</ol>
<ul>
<li>방화벽에서 다른 방화벽까지 전송되는 데이터를 암호화하여 보내는 것으로, 보통 VPN의 기능을 이용</li>
</ul>
<p>관련 명령어 
<code>ufw --help</code></p>
<h3 id="한줄-요약">한줄 요약</h3>
<blockquote>
<p>방화벽은 LAN과 WAN 에 접근을 제어하고 감시하는역활이구나! </p>
</blockquote>
<hr>
<p>글 읽어주셔서 감사합니다. :) </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Ubuntu - 서버구축 spring jar파일 ]]></title>
            <link>https://velog.io/@dev_yohan/Ubuntu-%EC%84%9C%EB%B2%84%EA%B5%AC%EC%B6%95-spring-jar%ED%8C%8C%EC%9D%BC</link>
            <guid>https://velog.io/@dev_yohan/Ubuntu-%EC%84%9C%EB%B2%84%EA%B5%AC%EC%B6%95-spring-jar%ED%8C%8C%EC%9D%BC</guid>
            <pubDate>Fri, 18 Jul 2025 09:39:04 GMT</pubDate>
            <description><![CDATA[<h2 id="spring-jar파일-배포">spring jar파일 배포</h2>
<h1 id="1-서버구축">1. 서버구축</h1>
<h2 id="11-배포환경-구축">1.1 배포환경 구축</h2>
<h3 id="포트포워딩">포트포워딩</h3>
<p>외부 요청(공인 IP:포트) → 공유기를 거쳐 내부 IP로 들어오는 트래픽을, 내부 서버(192.168.x.x)가 수신하도록 허용해야 합니다. 내가 8080을 열어두면 공인 IP:8080이 접속 되는것!</p>
<h3 id="방법">방법</h3>
<h4 id="공유기-설정">공유기 설정</h4>
<p>저는 LG 를사용합니다!</p>
<p><strong>명령어</strong> ip a
<img src="https://velog.velcdn.com/images/dev_yohan/post/16af3ea8-6bdf-4ff9-91a1-5bbffd2a2f3d/image.png" alt=""></p>
<h3 id="1921682191-접속">192.168.219.1 접속</h3>
<ol>
<li>접속하시면 공유기에 패스워드 즉 관리자 비밀번호 입력하고  들어가주세요 </li>
<li>네비게이션 바에 있는 네트워크 설정에 nat 설정에 들어가시면 
밑에 와 같은 화면이 출력될거에요 !
<img src="https://velog.velcdn.com/images/dev_yohan/post/a009a7b6-5765-421c-b6bc-9b634dea8ae8/image.png" alt=""></li>
</ol>
<p>명령어 ip a에 들어어 제가 192.168.219.104 = private IP DMZ 등록 해주시고 DMZ 설정에 사용함으로 바꾼다음에 적용 눌러주세요!
<img src="https://velog.velcdn.com/images/dev_yohan/post/1a23e40c-9132-4df1-9fbb-f5a54e80f226/image.png" alt="">
여기서도 제가 허용할 포트를  내부포트 서비스 포트 입력하신후에 적용하시면 공유기 설정은 끝납니다! </p>
<h2 id="우분투-설정">우분투 설정</h2>
<p>터미널 창에 명령어</p>
<pre><code class="language-XML">sudo ufw enable // 방화벽 활성화 
sudo ufw allow 8080 // 방화벽에 8080포트 열기 
sudo ufw status // 상태보기 
sudo ufw reload //  방화벽 규칙 재적용</code></pre>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/bbb08de0-f02c-4d32-896a-2a295e5dc673/image.png" alt="">
이러면 8080포트 방화벽 허용을 잘한거 같네요!</p>
<p>이러면 우분투 설정도 끝!</p>
<h2 id="spring-설정">spring 설정</h2>
<h3 id="applicationproperties">application.properties</h3>
<p>server.address=0.0.0.0 #전체 허용 
server.port=8080 #포트번호 설정 8080</p>
<h3 id="명령어">명령어</h3>
<p>./gradle build // 빌드 
./gradlew bootRun // 빌드 실행 </p>
<p>이제 빌드 해주고, 실행하면됩니다!./gradlew bootRun</p>
<h2 id="실행">실행</h2>
<p>설정 끝나고 실행 해보겠습니다! </p>
<p>그전에 우분투에서 확인해보겠습니다! 
<img src="https://velog.velcdn.com/images/dev_yohan/post/ea8aa2f3-afe4-4bfd-be47-faf053638518/image.png" alt="">
일단 잘 실행되네요!</p>
<p>우분투에서 내부 접속망으로 확인해겠습니다
<img src="https://velog.velcdn.com/images/dev_yohan/post/64039154-bdea-4516-9a9d-a42639595ea7/image.png" alt="">
ㅎㅎ스웨거 잘 올라와있네요 </p>
<p><img src="https://velog.velcdn.com/images/dev_yohan/post/038579aa-6abb-41c5-9758-14822a3861a1/image.png" alt=""></p>
<p>제 작업 환경에 mac인 pc 에서도 공인 IP로 접속 성공했습니다!</p>
<h2 id="주의점">주의점</h2>
<p>우분투에서 서버 구축했으나 우분투 안에서 공인 IP로는 접속이 안됩니다! 
그래서 다른 PC나 모바일에서 확인해보시는게 좋아요!</p>
<p>명령어 curl ifconfig.me 라고 터미널창에 입력하시면 공인 ip확인할수있습니다.</p>
<h3 id="느낀점">느낀점</h3>
<p>하.. 3일동안 밤새면서 인터넷 서치 해보고 실패도 엄청해보고 우분투에서 열어서 공인 IP로 접속 안되는것도 알고.. private IP 와 public IP 개념도 이해해하는데 조금 오래 걸렸네요 ...</p>
<p>글 읽어주셔서 감사합니다 :)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Ubuntu  desktop 적용 ]]></title>
            <link>https://velog.io/@dev_yohan/Ubuntu-desktop-%EC%A0%81%EC%9A%A9</link>
            <guid>https://velog.io/@dev_yohan/Ubuntu-desktop-%EC%A0%81%EC%9A%A9</guid>
            <pubDate>Wed, 16 Jul 2025 02:02:50 GMT</pubDate>
            <description><![CDATA[<p>하.. 뭐 윈도우 맥 만쓰다가 대부분을 서버 구축이나 다양한 분야나 다른 개발자 분들도 리눅스 환경에서 개발 하시는걸 보고.. 저도 이참에 운영체제를 리눅스로 변경할려고합니다 ..ㅎㅎ 
방법은 간단해요 ! </p>
<ol>
<li>안쓰는 USB 가져오기!</li>
<li><a href="https://ubuntu.com/download/desktop">https://ubuntu.com/download/desktop</a>
다운 받기 
2-1 파일이 .iso 이라는 파일이 있을겁니다! </li>
<li>refus 라는곳에서 USB를 우분투에 굽기!
.exe 실행 및 파티션 설정하실분은 설정해주세요<br>굽는다라는 표현 학교에서 교수님이 웃으면서 설명하실때 나는 그럴일없다고 생각했는데.</li>
<li>USB 확인</li>
<li>굽기가 완료되면 시스템 재시작할때 F2 이거나 부팅할때 메세지가 뜰건데 부팅 메뉴 (??) 그거 들어가서 1번은 usb 로설정해주세요! 그리고 저장하고 나가기!</li>
<li>try or install ubuntu 있는데  대부분 1번에 있을거에요 </li>
<li>저처럼 초기화를 하고 작업하실분은 메세지 중에 파일 정리가 있으실거에요 그러면 부팅할때 초기화 작업도 같이해주니까 한번해보세요!</li>
</ol>
<p>진행현황이나 사진이라도 찍어놓을껄 ..ㅠㅠ</p>
<p>글 보고 난 모르겠다 이러시면 댓글주세요 :D </p>
]]></description>
        </item>
    </channel>
</rss>