<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>changi123.log</title>
        <link>https://velog.io/</link>
        <description>개발자 홍찬기 꾸준한 사람이 되자</description>
        <lastBuildDate>Wed, 04 Feb 2026 12:40:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>changi123.log</title>
            <url>https://velog.velcdn.com/images/changi_gg/profile/c52fe591-3253-4255-92f0-cede2cf3d3d6/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. changi123.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/changi_gg" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[subtrack 서비스 운영 2일차 후기]]></title>
            <link>https://velog.io/@changi_gg/subtrack-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%9A%B4%EC%98%81-2%EC%9D%BC%EC%B0%A8-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@changi_gg/subtrack-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%9A%B4%EC%98%81-2%EC%9D%BC%EC%B0%A8-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Wed, 04 Feb 2026 12:40:00 GMT</pubDate>
            <description><![CDATA[<h1 id="subtrack-서비스-출시-2일차-유입-지표-및-ux-개선-회고">[SubTrack] 서비스 출시 2일차 유입 지표 및 UX 개선 회고</h1>
<blockquote>
<p><strong>서비스 링크:</strong> <a href="https://subtrack.kr/">https://subtrack.kr/</a></p>
</blockquote>
<hr>
<h2 id="📊-2일차-실시간-운영-지표-2026-02-04">📊 2일차 실시간 운영 지표 (2026-02-04)</h2>
<p><em>GA4를 통해 집계된 실제 유입 데이터입니다.</em></p>
<ul>
<li><strong>활성 사용자 수:</strong> 78명</li>
<li><strong>신규 사용자 수:</strong> 74명</li>
<li><strong>평균 참여 시간:</strong> 19초</li>
<li><strong>총 이벤트 수:</strong> 331회 (1인당 약 4.2회 액션)</li>
</ul>
<hr>
<h2 id="🛠️-문제-해결-1-알림-권한-ux-개선">🛠️ 문제 해결 1: 알림 권한 UX 개선</h2>
<p><em>PWA 환경에서 유저가 알림 권한을 &#39;거절&#39;했을 때 발생하는 &#39;데드락&#39; 상태 해결</em></p>
<h3 id="1-문제-상황">1. 문제 상황</h3>
<ul>
<li>브라우저 보안 정책상 유저가 한 번 &#39;거절&#39;을 누르면 다시는 권한 요청 팝업을 띄울 수 없음.</li>
<li>유저가 직접 시스템 설정에서 권한을 풀어야 하지만, 그 과정이 매우 번거로워 이탈 원인이 됨.</li>
</ul>
<h3 id="2-해결-방법-os별-맞춤형-가이드-ui">2. 해결 방법: OS별 맞춤형 가이드 UI</h3>
<ul>
<li><code>navigator.userAgent</code>를 활용하여 유저의 접속 OS 감지.</li>
<li><strong>안드로이드:</strong> <code>설정</code> &gt; <code>애플리케이션</code> &gt; <code>SubTrack</code> 경로 가이드.</li>
<li><strong>iOS:</strong> <code>설정</code> &gt; <code>알림</code> &gt; <code>SubTrack</code> (홈 화면 추가 필수) 안내.</li>
<li><strong>바텀 시트(Bottom Sheet)</strong>를 도입하여 유저가 헤매지 않도록 시각적 &#39;지도&#39; 제공.</li>
</ul>
<hr>
<h2 id="🛠️-문제-해결-2-익명-사용자-세션-최적화">🛠️ 문제 해결 2: 익명 사용자 세션 최적화</h2>
<p><em>불필요한 계정 재생성 방지 및 세션 유지 전략</em></p>
<h3 id="1-문제-상황-1">1. 문제 상황</h3>
<ul>
<li>익명 로그인 기능을 제공하다 보니, 유저가 무심코 &#39;로그아웃&#39;을 눌러 기존에 등록한 구독 데이터(세션)를 잃어버리는 케이스 발생.</li>
<li>한 세션 내에서 불필요하게 여러 번 익명 로그인이 반복되는 것을 방지할 필요성 느낌.</li>
</ul>
<h3 id="2-해결-방법-조건부-ui-렌더링">2. 해결 방법: 조건부 UI 렌더링</h3>
<ul>
<li>Firebase Auth의 <code>isAnonymous</code> 속성을 활용.</li>
<li><strong>익명 로그인 유저</strong>에게는 아예 <strong>&#39;로그아웃&#39; 버튼을 숨김 처리</strong>하여 의도치 않은 데이터 유실 방지.</li>
<li>&quot;계속 사용하려면 정식 가입하세요&quot;라는 안내와 함께 소셜 계정 연동(Link)을 유도하는 동선으로 개선.</li>
</ul>
<hr>
<h2 id="💡-앞으로-고민할-것들">💡 앞으로 고민할 것들</h2>
<ol>
<li><strong>서비스 고도화</strong>: 등록된 구독 정보를 기반으로 한 푸시 알림 로직 정교화.</li>
<li><strong>새로운 주제</strong>: 구독 서비스 외에 정기 지불이 발생하는 다른 도메인 확장 가능성 탐색.</li>
<li><strong>유입 경로 최적화</strong>: 구글 광고 외에 커뮤니티나 SNS를 통한 유기적(Organic) 유입 경로 설계 및 반영.</li>
</ol>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Project] SubTrack: AI 기반 구독 관리 및 자동 알림 서비스]]></title>
            <link>https://velog.io/@changi_gg/Project-SubTrack-AI-%EA%B8%B0%EB%B0%98-%EA%B5%AC%EB%8F%85-%EA%B4%80%EB%A6%AC-%EB%B0%8F-%EC%9E%90%EB%8F%99-%EC%95%8C%EB%A6%BC-%EC%84%9C%EB%B9%84%EC%8A%A4</link>
            <guid>https://velog.io/@changi_gg/Project-SubTrack-AI-%EA%B8%B0%EB%B0%98-%EA%B5%AC%EB%8F%85-%EA%B4%80%EB%A6%AC-%EB%B0%8F-%EC%9E%90%EB%8F%99-%EC%95%8C%EB%A6%BC-%EC%84%9C%EB%B9%84%EC%8A%A4</guid>
            <pubDate>Sun, 01 Feb 2026 16:10:18 GMT</pubDate>
            <description><![CDATA[<h1 id="🚀-subtrack-ai-기반-스마트-구독-가계부-서비스">🚀 SubTrack: AI 기반 스마트 구독 가계부 서비스</h1>
<blockquote>
<p><strong>서비스 URL</strong>: <a href="https://subtrack.kr">https://subtrack.kr</a><br><strong>핵심 가치</strong>: AI 기반 자동화, 사용자 맞춤형 푸시 알림</p>
</blockquote>
<hr>
<h2 id="1-📋-서비스-소개">1. 📋 서비스 소개</h2>
<p><strong>SubTrack</strong>은 흩어져 있는 구독 서비스(OTT, 소프트웨어 등)를 한곳에서 관리하고, 결제일 전 알림을 통해 불필요한 지출을 방지하는 <strong>개인 맞춤형 구독 관리 솔루션</strong>입니다.</p>
<ul>
<li><strong>Smart</strong>: OpenAI API를 활용해 서비스명만 입력해도 요금제 정보 자동 완성.</li>
<li><strong>Proactive</strong>: 결제 3일 전, 잊지 않도록 푸시 알림(Web Push) 발송.</li>
<li><strong>Light</strong>: 별도 설치가 필요 없는 PWA(Progressive Web App) 기반의 앱 경험 제공.</li>
</ul>
<hr>
<h2 id="2-🛠-tech-stack">2. 🛠 Tech Stack</h2>
<table>
<thead>
<tr>
<th align="left">구분</th>
<th align="left">기술 스택</th>
<th align="left">비고</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>Frontend</strong></td>
<td align="left"><code>React.js</code>, <code>Vanilla CSS</code></td>
<td align="left">Mobile First (max-width: 480px)</td>
</tr>
<tr>
<td align="left"><strong>Backend</strong></td>
<td align="left"><code>Cloud Functions v2</code></td>
<td align="left">Node.js 22+, Daily Scheduler (01:00 KST)</td>
</tr>
<tr>
<td align="left"><strong>Database</strong></td>
<td align="left"><code>Cloud Firestore</code></td>
<td align="left"><code>collectionGroup</code> 쿼리 기반 데이터 통합 관리</td>
</tr>
<tr>
<td align="left"><strong>Auth</strong></td>
<td align="left"><code>Firebase Auth</code></td>
<td align="left">Google OAuth 기반 간편 로그인</td>
</tr>
<tr>
<td align="left"><strong>Push</strong></td>
<td align="left"><code>FCM (Web Push)</code></td>
<td align="left">푸시 알림 엔진</td>
</tr>
</tbody></table>
<hr>
<h2 id="💡-핵심-트러블슈팅-firestore-indexing">💡 핵심 트러블슈팅: Firestore Indexing</h2>
<h3 id="issue-failed_precondition-code-9"><strong>[Issue] FAILED_PRECONDITION (Code: 9)</strong></h3>
<p>모든 유저의 하위 컬렉션을 통합 검색하는 <code>collectionGroup</code> 쿼리 사용 시, 인덱스 부재로 인해 배치 엔진이 중단되는 문제 발생.</p>
<h3 id="solution-단일-필드-컬렉션-그룹-색인-활성화"><strong>[Solution] 단일 필드 컬렉션 그룹 색인 활성화</strong></h3>
<ul>
<li><strong>문제 원인</strong>: 단일 컬렉션 범위의 색인만으로는 하위 컬렉션 전체 검색 불가.</li>
<li><strong>해결 방법</strong>: <code>subscriptions</code> 컬렉션의 <code>date</code> 필드에 대해 <strong>&#39;컬렉션 그룹(Collection Group)&#39;</strong> 범위를 수동으로 활성화하여 해결.</li>
</ul>
<hr>
<h2 id="🎯-향후-업데이트-계획">🎯 향후 업데이트 계획</h2>
<ul>
<li><input disabled="" type="checkbox"> <strong>지출 리포트</strong>: 월별 구독료 지출 통계 시각화.</li>
<li><input disabled="" type="checkbox"> <strong>카테고리 자동 분류</strong>: AI 기반 구독 항목 분류.</li>
</ul>
<hr>
<h2 id="🌙-maintenance-log-20260202">🌙 Maintenance Log (2026.02.02)</h2>
<ul>
<li>FCM Web Push 인프라 구축 완료.</li>
<li>Firestore 복합/단일 필드 색인 최적화 완료.</li>
<li>새벽 00시 배치 스케줄러 정상 작동 확인.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Grow5 프로젝트]]></title>
            <link>https://velog.io/@changi_gg/Grow5</link>
            <guid>https://velog.io/@changi_gg/Grow5</guid>
            <pubDate>Sat, 14 Jun 2025 15:58:02 GMT</pubDate>
            <description><![CDATA[<h1 id="📚-5분-투자형-지식-피드---grow5">📚 5분 투자형 지식 피드 - Grow5</h1>
<h2 id="1-프로젝트-소개">1. 프로젝트 소개</h2>
<p><strong>Grow5</strong>는 사용자가 관심 있는 주제를 입력하면 관련된 <strong>유튜브 영상, 네이버 블로그, 네이버 뉴스</strong>를 추천해주는 웹앱
짧은 시간 안에 폭넓은 정보를 탐색하고 습득할 수 있도록 설계</p>
<ul>
<li>🖥 <strong>배포 주소</strong>: <a href="https://grow5-62185.web.app/">https://grow5-62185.web.app/</a></li>
<li>📁 <strong>주요 기능</strong>: 키워드 기반 추천, 유튜브/블로그/뉴스 추천, 랜덤 추천 기능</li>
<li>🛠 <strong>GitHub</strong>: <a href="https://github.com/changi123/grow5">https://github.com/changi123/grow5</a> </li>
</ul>
<hr>
<h2 id="2-프로젝트-스택">2. 프로젝트 스택</h2>
<ul>
<li><strong>Frontend</strong>: React (Vite 기반)</li>
<li><strong>Backend (프록시 서버)</strong>: Firebase Functions (Node.js, Axios)</li>
<li><strong>API 연동</strong><ul>
<li>YouTube Data API v3</li>
<li>Naver Search API (Blog / News)</li>
</ul>
</li>
<li><strong>Styling</strong>: 기본 CSS, Inline Style</li>
<li><strong>기타</strong>: React Router v6, Firebase Secret Manager, 환경변수 사용</li>
</ul>
<hr>
<h2 id="3-주요-기능-소개">3. 주요 기능 소개</h2>
<h3 id="✅-키워드-기반-추천-페이지-메인">✅ 키워드 기반 추천 페이지 (메인)</h3>
<ul>
<li>사용자가 키워드를 입력하면 해당 키워드로 관련 콘텐츠 검색</li>
<li>추천 결과: 유튜브 영상, 블로그 글, 뉴스 기사</li>
<li>각 결과는 카드 형태로 출력 (썸네일, 제목, 간략 요약 제공)</li>
<li>&quot;다시 추천 받기&quot; 기능으로 랜덤 추천 가능</li>
</ul>
<h3 id="📝-구글-로그인">📝 구글 로그인</h3>
<ul>
<li>firebase에서 지원하는 구글 로그인 사용으로 google 로그인 시 기능 사용</li>
</ul>
<hr>
<h3 id="🎞️-유튜브-영상-추천">🎞️ 유튜브 영상 추천</h3>
<ul>
<li>YouTube Data API 활용</li>
<li>입력 키워드 기반 검색 → 50개 검색 결과 중 랜덤 2개 추천</li>
<li>썸네일, 제목, 채널명, 간략 설명 표시</li>
</ul>
<hr>
<h3 id="📝-네이버-블로그-추천">📝 네이버 블로그 추천</h3>
<ul>
<li>Naver Search API (blog) 활용</li>
<li>Firebase Functions 프록시 서버 경유 → API Key 보안 확보</li>
<li>블로그 제목, 발행 블로거, 요약 제공</li>
</ul>
<hr>
<h3 id="📰-네이버-뉴스-추천">📰 네이버 뉴스 추천</h3>
<ul>
<li>Naver Search API (news) 활용</li>
<li>역시 Firebase Functions 프록시 서버 경유</li>
<li>뉴스 제목, 출처, 요약 제공</li>
</ul>
<hr>
<h2 id="4-후기">4. 후기</h2>
<ul>
<li>네이버 API를 사용하기 위해 firebase Function을 써서  프록시 서버 경유 해본 것이 좀 재밌었다.</li>
<li>유튜브, 네이버 등 OPEN API KEY를 발급받아 활용해보니 훨씬 보여줄 수 있는 데이터 수준이 올라간다.</li>
<li>또 다른 firebase에서 지원하는 기능들을 사용해보자 스토리지, 실시간 로그 등등</li>
<li>더욱 다양한 OPEN API로 좋은 주제로 간단한 프로젝트 다양하게 해보자</li>
</ul>
<hr>
<h2 id="5-주요-ui">5. 주요 UI</h2>
<h3 id="메인화면">메인화면</h3>
<table align="center">
  <tr>
    <td align="center"><img src="https://velog.velcdn.com/images/changi_gg/post/b943fe35-5621-47d8-ae2f-6dbb64dadcec/image.jpg" width="300"/></td>
  </tr>
</table>

<h3 id="로그인화면--구글-로그인">로그인화면 &amp; 구글 로그인</h3>
<table align="center">
  <tr>
    <td align="center"><img src="https://velog.velcdn.com/images/changi_gg/post/7494ee59-5d58-4c15-a9e5-f6b77c79d69e/image.jpg" width="300"/></td>
    <td align="center"><img src="https://velog.velcdn.com/images/changi_gg/post/efe5e923-36e4-44c3-8acd-b95e1f5dab4c/image.jpg" width="300"/></td>
  </tr>
</table>

<h3 id="추천-관심사-설정--설정된-관심사">추천 관심사 설정 &amp; 설정된 관심사</h3>
<table align="center">
  <tr>
    <td align="center"><img src="https://velog.velcdn.com/images/changi_gg/post/f489362f-29be-400d-b0f1-bf059001fbe4/image.jpg" width="300"/></td>
    <td align="center"><img src="https://velog.velcdn.com/images/changi_gg/post/d8f39b97-a42d-4a1c-9be2-e292ca56a2e5/image.jpg" width="300"/></td>
  </tr>
</table>

<h3 id="관심사-호출-유튜브api--관심사-호출-네이버api">관심사 호출 유튜브API &amp; 관심사 호출 네이버API</h3>
<table align="center">
  <tr>
    <td align="center"><img src="https://velog.velcdn.com/images/changi_gg/post/1e54f9c0-99e5-40f5-948c-f9fb1a9c6684/image.jpg" width="300"/></td>
    <td align="center"><img src="https://velog.velcdn.com/images/changi_gg/post/7b075302-bf83-4ce0-bd63-c82a5428e65a/image.jpg" width="300"/></td>
  </tr>
</table>
]]></description>
        </item>
        <item>
            <title><![CDATA[viewpick 프로젝트 ]]></title>
            <link>https://velog.io/@changi_gg/viewpick-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</link>
            <guid>https://velog.io/@changi_gg/viewpick-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</guid>
            <pubDate>Sun, 25 May 2025 14:52:41 GMT</pubDate>
            <description><![CDATA[<h1 id="🎬-오늘-뭐-볼까-기분-기반-영화-추천-웹앱---viewpick">🎬 오늘 뭐 볼까? 기분 기반 영화 추천 웹앱 - ViewPick</h1>
<h2 id="1-프로젝트-소개">1. 프로젝트 소개</h2>
<p><strong>ViewPick</strong>은 사용자의 <strong>기분</strong>에 따라 오늘 볼 영화를 추천해주는 웹앱입니다.<br>“오늘 뭐 볼까?” 버튼을 눌러 현재 기분을 선택하면, 그에 어울리는 영화가 랜덤으로 추천됩니다.<br>또한, 탐색 페이지에서 원하는 장르, 국가, 키워드 등으로 영화 콘텐츠를 탐색할 수 있습니다.</p>
<ul>
<li><strong>🖥 배포 주소</strong>: <a href="https://viewpick-web.web.app/">https://viewpick-web.web.app/</a></li>
<li><strong>📁 주요 기능</strong>: 기분 기반 영화 추천, 조건 탐색, 상세 정보 확인, 찜 목록 저장</li>
<li>*<em>🛠 GitHub *</em>: <a href="https://github.com/changi123/viewpick">https://github.com/changi123/viewpick</a></li>
</ul>
<hr>
<h2 id="2-프로젝트-스택">2. 프로젝트 스택</h2>
<ul>
<li><strong>Frontend</strong>: React (CRA 기반)</li>
<li><strong>Backend/서비스</strong>: Firebase Hosting / Firebase Authentication</li>
<li><strong>API</strong>: TMDb (The Movie Database API)</li>
<li><strong>Styling</strong>: CSS-in-JS, Inline Style</li>
<li><strong>기타</strong>: React Router v6, 환경변수 사용</li>
</ul>
<hr>
<h2 id="3-주요-기능-소개">3. 주요 기능 소개</h2>
<h3 id="✅-기분-기반-랜덤-추천-페이지-홈">✅ 기분 기반 랜덤 추천 페이지 (홈)</h3>
<ul>
<li>“🎲 오늘 뭐 볼까?” 버튼 클릭</li>
<li>사용자 기분 선택 (예: 우울해요, 기분 좋아요, 설레요, 심심해요 등)</li>
<li>선택한 감정에 맞는 영화 장르로 필터링된 영화 중 무작위로 추천</li>
<li>영화 정보 카드 형태로 출력</li>
<li>“마음에 들어요” / “나중에 볼래요” 버튼으로 찜 기능 제공 ( 추가예정 )</li>
</ul>
<h3 id="🔍-콘텐츠-탐색-페이지-search--추가예정-">🔍 콘텐츠 탐색 페이지 (<code>/search</code>) ( 추가예정 )</h3>
<ul>
<li>TMDb API 기반 영화 목록 탐색</li>
<li>조건 필터: 장르 / 국가 / 키워드 / 연도 ( 추가예정 )</li>
<li>무한스크롤 방식으로 영화 카드 출력</li>
</ul>
<h3 id="🎞️-상세-페이지-detailid">🎞️ 상세 페이지 (<code>/detail/:id</code>)</h3>
<ul>
<li>영화의 포스터, 제목, 개봉일, 평점, 줄거리 등 정보 표시</li>
<li>주요 출연진 5명, 제공 중인 OTT(한국 기준) 정보 포함</li>
<li>유튜브 예고편 임베드</li>
<li>TMDb 추천 영화 6개 출력</li>
</ul>
<h3 id="⭐-즐겨찾기-페이지-favorites--추가예정-">⭐ 즐겨찾기 페이지 (<code>/favorites</code>) ( 추가예정 )</h3>
<ul>
<li>로그인한 사용자 전용</li>
<li>“마음에 들어요” / “나중에 볼래요”로 저장한 영화 리스트 확인 가능</li>
</ul>
<h3 id="👤-마이페이지--추가예정-">👤 마이페이지 ( 추가예정 )</h3>
<ul>
<li>Firebase Auth 기반 로그인 / 회원가입</li>
<li>찜한 영화 목록 관리</li>
</ul>
<hr>
<h2 id="4-핵심-구현-포인트">4. 핵심 구현 포인트</h2>
<h3 id="😄-기분-기반-추천-로직">😄 기분 기반 추천 로직</h3>
<ul>
<li>사용자가 기분을 선택하면 미리 정의된 기분-장르 매핑 데이터를 기반으로 랜덤 추천<ul>
<li>예: <code>우울해요 → 코미디</code>, <code>설레요 → 로맨스</code>, <code>심심해요 → 액션</code></li>
</ul>
</li>
<li>선택된 장르를 기반으로 TMDb에서 영화를 호출하고, 거기서 무작위 추출</li>
</ul>
<h3 id="🔑-tmdb-api-활용">🔑 TMDb API 활용</h3>
<ul>
<li>다양한 endpoint: <code>/discover/movie</code>, <code>/movie/{id}</code>, <code>/movie/{id}/videos</code>, <code>/movie/{id}/recommendations</code></li>
<li>국가, 장르, 키워드 등 파라미터 필터 활용</li>
<li>유튜브 예고편 키 추출 후 iframe 임베딩</li>
</ul>
<h3 id="🔥-firebase-연동">🔥 Firebase 연동</h3>
<ul>
<li>Firebase Auth를 통해 로그인/회원가입 구현</li>
<li>로그인 여부에 따라 찜 버튼 활성화</li>
<li>Firebase Hosting으로 배포</li>
</ul>
<hr>
<h2 id="5-주요-ui">5. 주요 UI</h2>
<table>
<thead>
<tr>
<th align="center"><img src="https://velog.velcdn.com/images/changi_gg/post/5fcae648-681b-4f7d-8ce2-9f2b6bb50fe7/image.jpg" alt="홈화면"></th>
<th align="center"><img src="https://velog.velcdn.com/images/changi_gg/post/5ed8b0e4-8116-4385-a93d-294acb4fc8d2/image.jpg" alt="기분선택"></th>
</tr>
</thead>
<tbody><tr>
<td align="center">홈화면</td>
<td align="center">기분 선택</td>
</tr>
</tbody></table>
<table>
<thead>
<tr>
<th align="center"><img src="https://velog.velcdn.com/images/changi_gg/post/9736fc16-5120-4c9c-8bd0-a3d347217087/image.jpg" alt="추천결과"></th>
<th align="center"><img src="https://velog.velcdn.com/images/changi_gg/post/82d0e926-b38e-469f-ae13-5839bc6951ab/image.jpg" alt="상세페이지"></th>
</tr>
</thead>
<tbody><tr>
<td align="center">기분 선택 시 추천 결과</td>
<td align="center">상세 페이지</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[OJT 기간 끝]]></title>
            <link>https://velog.io/@changi_gg/OJT-%EA%B8%B0%EA%B0%84-%EB%81%9D</link>
            <guid>https://velog.io/@changi_gg/OJT-%EA%B8%B0%EA%B0%84-%EB%81%9D</guid>
            <pubDate>Thu, 01 May 2025 14:45:26 GMT</pubDate>
            <description><![CDATA[<h2 id="1-ojt-기간-끝">1. OJT 기간 끝</h2>
<h4 id="2월말에-입사-후-약-2개월-간의-ojt-기간이-끝났다-😎">2월말에 입사 후 약 2개월 간의 OJT 기간이 끝났다 😎</h4>
<h4 id="내가-맡게-된-ojt-팀프로젝트는-회사-솔루션과-javascript를-사용해서-하나의-기능을-만드는-것이었다">내가 맡게 된 OJT 팀프로젝트는 회사 솔루션과 JavaScript를 사용해서 하나의 기능을 만드는 것이었다.</h4>
<hr>
<h2 id="2-동기들과-팀프로젝트">2. 동기들과 팀프로젝트</h2>
<h4 id="3인-1조로-구성되어-팀프로젝트를-진행했고-팀장을-맡게-되었는데-처음엔-걱정이-많았다-코드를-작성하고-문제를-해결하기위해서-시간과-노력을-들이는건-자신있지만-처음-사용해보는-회사솔루션을-잘-모르기에-팀장을-맡게-되는-것이-조금은-부담이었다-근데-마침-같은-조가-된-동기-2명이-친한-동기들이라-나름-부담을-덜-수-있었다😂-또-우리가-맡은-프로젝트는-솔루션의-사용보다는-java-sql-javascript를-통해-구현하는-것이-주이기에-그부분이라도-내가-할-수-있는-최대로-하고-팀원들에게-도움을-주자는-마음이-컸다">3인 1조로 구성되어 팀프로젝트를 진행했고 팀장을 맡게 되었는데 처음엔 걱정이 많았다.. 코드를 작성하고 문제를 해결하기위해서 시간과 노력을 들이는건 자신있지만 처음 사용해보는 회사솔루션을 잘 모르기에 팀장을 맡게 되는 것이 조금은 부담이었다. 근데 마침 같은 조가 된 동기 2명이 친한 동기들이라 나름 부담을 덜 수 있었다😂 또 우리가 맡은 프로젝트는 솔루션의 사용보다는 Java, SQL, JavaScript를 통해 구현하는 것이 주이기에 그부분이라도 내가 할 수 있는 최대로 하고 팀원들에게 도움을 주자는 마음이 컸다.</h4>
<h4 id="팀프로젝트를-진행하면서-팀원들이-모두-스스로-열심히-하려는-생각이-많고-같은-동기지만-망설이지-않고-나에게-질문해주는-것도-너무-고마웠다-또-나도-그과정에서-많이-물어보고-많은-것들을-도움-받았다-프로젝트가-끝난-지금-같은팀이-되지-못해-너무나도-아쉽다😂-팀원들도-너무-좋았고-구현하는-것이-너무-재밌었기에-회사에-가야한다는-생각보다-빨리-코드를-작성하러-회사에-가고-싶다는-생각이-더-많이-들었던-것-같다-🚀-이부분에서-이전에도-밤을-새고-스트레스를-받아가면-코드를-작성하는-것이-즐거웠지만-개발자라는-직업에-대해-더욱-확신이-들었다">팀프로젝트를 진행하면서 팀원들이 모두 스스로 열심히 하려는 생각이 많고 같은 동기지만 망설이지 않고 나에게 질문해주는 것도 너무 고마웠다. 또 나도 그과정에서 많이 물어보고 많은 것들을 도움 받았다. 프로젝트가 끝난 지금 같은팀이 되지 못해 너무나도 아쉽다😂 팀원들도 너무 좋았고 구현하는 것이 너무 재밌었기에 회사에 가야한다는 생각보다 빨리 코드를 작성하러 회사에 가고 싶다는 생각이 더 많이 들었던 것 같다 🚀 이부분에서 이전에도 밤을 새고 스트레스를 받아가면 코드를 작성하는 것이 즐거웠지만 개발자라는 직업에 대해 더욱 확신이 들었다.</h4>
<h4 id="회사에-가는-것이-일을-하는-것이-그냥-게임같다-그냥-질리지-않는다-내-코드가-맞는-방향성인지-회사의-솔루션에-알맞게-익숙해지고-있는-것인지는-아직-확실하지-않아도-머리속에서-생각한-것을-프론트와-백엔드를-구현할-수-있다는-것이-코딩이라는-게-너무나도-즐겁다-🙄">회사에 가는 것이, 일을 하는 것이 그냥 게임같다. 그냥 질리지 않는다. 내 코드가 맞는 방향성인지, 회사의 솔루션에 알맞게 익숙해지고 있는 것인지는 아직 확실하지 않아도 머리속에서 생각한 것을 프론트와 백엔드를 구현할 수 있다는 것이 코딩이라는 게 너무나도 즐겁다 🙄</h4>
<hr>
<h2 id="3-javascript에-대한-생각">3. JavaScript에 대한 생각</h2>
<h4 id="나는-2번의-학원을-다니면서-풀스택-과정과-혼자서-react-프로젝트를-진행해보기도-했지만-그래도-java라는-언어가-가장-강하고-가장-재밌고-가장-활용범위가-넓다고-생각했었다-근데-프로젝트를-진행하며-java보다는-javascript를-활용해서-로직을-처리하고-구현하는-것이-더-많았다-이게-좀-놀랐다😶-정말-필요한-java코드와-sql만을-사용하고-javascript로-웹-상에서-필요한-대부분의-것들을-구현할-수-있다는-것이-신기했다-또-java에서의-메소드와-비슷한-역할을-하지만-로직을-짤-때-조금-더-효율성있게-구현할-수-있다는-것도-너무-편하면서-신기했다">나는 2번의 학원을 다니면서 풀스택 과정과 혼자서 React 프로젝트를 진행해보기도 했지만 그래도 Java라는 언어가 가장 강하고 가장 재밌고 가장 활용범위가 넓다고 생각했었다. 근데 프로젝트를 진행하며 Java보다는 JavaScript를 활용해서 로직을 처리하고 구현하는 것이 더 많았다. 이게 좀 놀랐다..😶 정말 필요한 Java코드와 SQL만을 사용하고 JavaScript로 웹 상에서 필요한 대부분의 것들을 구현할 수 있다는 것이 신기했다. 또 Java에서의 메소드와 비슷한 역할을 하지만 로직을 짤 때 조금 더 효율성있게 구현할 수 있다는 것도 너무 편하면서 신기했다.</h4>
<hr>
<h2 id="4-앞으로의-방향성">4. 앞으로의 방향성</h2>
<h4 id="이제-정신-없던-ojt-기간도-끝이-나고-팀-배정도-받았으니-그동안-못했던-java를-활용한-코테도-꾸준히-풀고-sql-공부도-더-하자-✈️-물론-java뿐만-아닌-javascript를-활용한-코테도-풀어보면서-같이-익히면-메소드를-활용할-수-있는-범위가-넓어져-좋을-것-같다-아마-프로젝트에-나가면-다시-처음엔-정신-없고-배우는데-바쁘겠지만-팀원분들도-배울게-많은분들이고-업무에-익숙해지면-공부할-수-있는-시간이-분명히-많이-나겠지-😁-백준도-오래걸리겠지만-플레까지-꼭-찍어보자-🔥">이제 정신 없던 OJT 기간도 끝이 나고 팀 배정도 받았으니 그동안 못했던 Java를 활용한 코테도 꾸준히 풀고 SQL 공부도 더 하자 ✈️ 물론 Java뿐만 아닌 JavaScript를 활용한 코테도 풀어보면서 같이 익히면 메소드를 활용할 수 있는 범위가 넓어져 좋을 것 같다. 아마 프로젝트에 나가면 다시 처음엔 정신 없고 배우는데 바쁘겠지만 팀원분들도 배울게 많은분들이고 업무에 익숙해지면 공부할 수 있는 시간이 분명히 많이 나겠지 😁 백준도 오래걸리겠지만 플레까지 꼭 찍어보자 🔥</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 한 줄로 서기 ( 11931번, JAVA )]]></title>
            <link>https://velog.io/@changi_gg/%EB%B0%B1%EC%A4%80-%ED%95%9C-%EC%A4%84%EB%A1%9C-%EC%84%9C%EA%B8%B0-11931%EB%B2%88-JAVA</link>
            <guid>https://velog.io/@changi_gg/%EB%B0%B1%EC%A4%80-%ED%95%9C-%EC%A4%84%EB%A1%9C-%EC%84%9C%EA%B8%B0-11931%EB%B2%88-JAVA</guid>
            <pubDate>Sun, 30 Mar 2025 09:00:35 GMT</pubDate>
            <description><![CDATA[<h4 id="sort--httpswwwacmicpcnetproblem11931-">sort ( <a href="https://www.acmicpc.net/problem/11931">https://www.acmicpc.net/problem/11931</a> )</h4>
<p><img src="https://velog.velcdn.com/images/changi_gg/post/7eba806e-d67d-47fd-913d-4ccb89f7ca9d/image.png" alt=""></p>
<h3 id="풀이">풀이</h3>
<ul>
<li>문제 보자마자 래퍼 클래스 Integer로 Arrays.sort(arr, Collrections.reverseOrder() ) 로 풀었지만 역시 시간초과가 떴다 😂</li>
<li>내가 아는 시간 줄이는 방법</li>
<li>입력값을 BufferedReader 로 받기 </li>
<li>System.println() 보다는 StringBuilder 생성해서 이어붙이고 한 번에 출력하기 </li>
<li>두 가지 방법을 쓰니 어거지로 성공 문제는 브론즈5인데 두 가지 모두 쓰라는 실버5 문제 </li>
<li>회사 OJT 기간이 끝나면 다시 골드부터 풀자 그전까지는 실버문제들만 풀기<pre><code class="language-java">package problem_solving.sort;
</code></pre>
</li>
</ul>
<p>import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.Scanner;</p>
<p>public class BaekJoon_11931 {</p>
<pre><code>public static void main(String[] args) throws IOException {
    Scanner sc = new Scanner(System.in);
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));    

    int n = Integer.parseInt(br.readLine());

    Integer [] arr = new Integer[n];

    StringBuilder sb = new StringBuilder();
    for(int i=  0; i &lt; arr.length;i++) {
        arr[i] = Integer.parseInt(br.readLine());
    }

    Arrays.sort(arr,Collections.reverseOrder());
    for (Integer integer : arr) {
        sb.append(integer+&quot;&quot;+&#39;\n&#39;);
    }

    System.out.println(sb.toString());
}</code></pre><p>}</p>
<pre><code>____________</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[ITSM 문제 CBT 만들어보기 ]]></title>
            <link>https://velog.io/@changi_gg/ITSM-%EB%AC%B8%EC%A0%9C-CBT-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@changi_gg/ITSM-%EB%AC%B8%EC%A0%9C-CBT-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Sun, 23 Mar 2025 14:44:27 GMT</pubDate>
            <description><![CDATA[<h2 id="1-회사에서-itsm-관련-자격증을-따면-좋다고-말씀해주셔서-일단-있는-가지고-있는-문제로-빠르게-gpt써서-만들어봤다-🙄-ngrok-로-포워딩-시켜놨으니-지하철이나-시간날-때-들어가서-풀어보자">1. 회사에서 ITSM 관련 자격증을 따면 좋다고 말씀해주셔서 일단 있는 가지고 있는 문제로 빠르게 gpt써서 만들어봤다 🙄 ngrok 로 포워딩 시켜놨으니 지하철이나 시간날 때 들어가서 풀어보자</h2>
<h3 id="1-프로젝트-생성-o">(1) 프로젝트 생성 o</h3>
<h3 id="2-db-생성-o">(2) DB 생성 o</h3>
<h3 id="3-문제-풀이-o">(3) 문제 풀이 o</h3>
<h3 id="4-정답-체크-후-다음-문제-이동-o">(4) 정답 체크 후 다음 문제 이동 o</h3>
<hr>
<h3 id="1-문제풀기-화면">1. 문제풀기 화면</h3>
<p><img src="https://github.com/user-attachments/assets/e673a677-25ad-4c72-a21b-fdc0629a6817" alt="ITSM 문제 이미지"></p>
<h3 id="2-문제추가-화면">2. 문제추가 화면</h3>
<p><img src="https://velog.velcdn.com/images/changi_gg/post/985ebc35-b78f-4477-b53a-ca2656c779b4/image.png" alt="ITSM 문제 추가 이미지"></p>
<hr>
<h2 id="cf">cf</h2>
<h3 id="1-이미지-필요한-문제있어서-이미지-저장하는거-컬럼-추가--이미지-파일-업로드--or-정적이미지만-할지-생각">(1) 이미지 필요한 문제있어서 이미지 저장하는거 컬럼 추가 ( 이미지 파일 업로드  or 정적이미지만 할지 생각)</h3>
<h3 id="2-인풋칸-텍스트아리아로-수정-해야함">(2) 인풋칸 텍스트아리아로 수정 해야함</h3>
<h3 id="3-지금은-한문제씩-넘어가야하니까-한-번에-볼-수-있게-전체-문제보기-화면-만들기---select--만-떄리면-끝일듯">(3) 지금은 한문제씩 넘어가야하니까 한 번에 볼 수 있게 전체 문제보기 화면 만들기 -&gt; SELECT * 만 떄리면 끝일듯..?</h3>
<h2 id="git-repo">git repo</h2>
<p><a href="https://github.com/changi123/itsm">https://github.com/changi123/itsm</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 롤케이크 ( 16206번, JAVA )]]></title>
            <link>https://velog.io/@changi_gg/%EB%B0%B1%EC%A4%80-%EB%A1%A4%EC%BC%80%EC%9D%B4%ED%81%AC-16206%EB%B2%88-JAVA</link>
            <guid>https://velog.io/@changi_gg/%EB%B0%B1%EC%A4%80-%EB%A1%A4%EC%BC%80%EC%9D%B4%ED%81%AC-16206%EB%B2%88-JAVA</guid>
            <pubDate>Mon, 17 Mar 2025 13:19:22 GMT</pubDate>
            <description><![CDATA[<h4 id="greedy--httpswwwacmicpcnetproblem16206-">Greedy ( <a href="https://www.acmicpc.net/problem/16206">https://www.acmicpc.net/problem/16206</a> )</h4>
<img src="https://velog.velcdn.com/images/changi_gg/post/44c34fbc-1a34-4d58-9cc1-58a76392082a/image.png" height="800px" width="800px">

<img src="https://velog.velcdn.com/images/changi_gg/post/338609cd-213a-493d-bc23-ed31503a097f/image.png" height="800px" width="800px">


<h3 id="풀이">풀이</h3>
<ul>
<li>정렬까지 하고 while문 로직을 10번은 썼다가 지운듯 .. 그래서 다른 사람 풀이를 찾아봤다  </li>
<li>내가 생각한건 나머지가 작은순으로 [길이,10으로 나눈 나머지] 정렬 후 자를 수 있는 횟수만큼 자르면서 카운팅</li>
<li>근데 이게 로직은 맞는데 생각한대로 구현이 안됐다 😂</li>
<li>보니까 10의 배수 길이인 케이크를 먼저 자른뒤 먼저 자른 10의 배수가 아닌 것들을 제외하고 잘라서 카운팅 </li>
<li>다른 사람 풀이 보니까 우선순위큐 썼는데 어차피 정렬 재정의 해서 하는건 같으니 좀 더 머리 굴려서 풀자 </li>
</ul>
<pre><code class="language-java">package problem_solving.greedy;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class BaekJoon_16206 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = Integer.parseInt(sc.next());
        int m = Integer.parseInt(sc.next());
        int [][] cakeList = new int [n][2];

        for(int i = 0 ; i &lt; n ; i++) {
            int num = Integer.parseInt(sc.next());
            cakeList[i][0] = num;
            cakeList[i][1] = num % 10 ;
        }

        Arrays.sort(cakeList, new Comparator&lt;int[]&gt;() {
            @Override
            public int compare(int [] o1, int[] o2) {
                return o1[0]-o2[0]; 
            }
        });

        int index =0 ; 
        int answer = 0 ;

        while (index &lt; n &amp;&amp; m &gt; 0) {
            int num = cakeList[index][0]; 
            int remainder = cakeList[index][1];
            index++;

            if (num &lt; 10) continue; 

            int pieces = num / 10; 
            int cutsNeeded = pieces - 1; 

            if (remainder == 0) {
                if (m &gt;= cutsNeeded) { 
                    answer += pieces;
                    m -= cutsNeeded;
                } else { 
                    answer += m;
                    m = 0;
                }
            }
        }

        index = 0;
        while (index &lt; n &amp;&amp; m &gt; 0) {
            int num = cakeList[index][0];
            int remainder = cakeList[index][1];
            index++;

            if (num &lt; 10 || remainder == 0) continue; 

            int pieces = num / 10;
            int cutsNeeded = pieces; 

            if (m &gt;= cutsNeeded) { 
                answer += pieces;
                m -= cutsNeeded;
            } else {
                answer += m;
                m = 0;
            }
        }

        System.out.println(answer);
    }

}

</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 나무 자르기 ( 14247번, JAVA )]]></title>
            <link>https://velog.io/@changi_gg/%EB%B0%B1%EC%A4%80-%EB%82%98%EB%AC%B4-%EC%9E%90%EB%A5%B4%EA%B8%B0-14247%EB%B2%88-JAVA</link>
            <guid>https://velog.io/@changi_gg/%EB%B0%B1%EC%A4%80-%EB%82%98%EB%AC%B4-%EC%9E%90%EB%A5%B4%EA%B8%B0-14247%EB%B2%88-JAVA</guid>
            <pubDate>Sun, 16 Mar 2025 12:08:55 GMT</pubDate>
            <description><![CDATA[<h4 id="greedy--httpswwwacmicpcnetproblem14247-">Greedy ( <a href="https://www.acmicpc.net/problem/14247">https://www.acmicpc.net/problem/14247</a> )</h4>
<img src="https://velog.velcdn.com/images/changi_gg/post/58f610d8-e770-4851-97e1-5b8359e5d716/image.png" height="800px" width="800px">

<img src="https://velog.velcdn.com/images/changi_gg/post/45cb0b59-2ce3-452f-9195-219dbf5e2989/image.png" height="800px" width="800px">

<h3 id="풀이">풀이</h3>
<ul>
<li>성장속도가 느린순으로 나무를 자르면 결국 성장속도가 빠른 나무는 day의 곱이 될테니 누적이 최대가됨 </li>
<li>성장속도가 느린순으로 나무를 잘라주면서 answer에 day에 따른 성장한 나무길이를 누적하면 정답 ✈️</li>
</ul>
<pre><code class="language-java">package problem_solving.greedy;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class BaekJoon_14247 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = Integer.parseInt(sc.next());

        int [][] arr = new int [n][2];

        for(int i = 0 ; i &lt; 2;i++) {
            for(int j = 0 ; j  &lt; n; j++) {
                arr[j][i] = Integer.parseInt(sc.next());
            }
        }
        Arrays.sort(arr,new Comparator&lt;int[]&gt;() {
            @Override
            public int compare(int [] o1, int [] o2 ) {
                return o1[1]-o2[1];
            }
        });
        int day = 0 ; 
        long answer = (long) 0 ;
        int index = 0 ; 
        while(n -- &gt; 0 ) {
            answer+=arr[index][0]+(arr[index][1] * day);
            index++;
            day++;
        }
        System.out.println(answer);
    }

}
</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - Yonsei TOTO ( 12018번, JAVA )]]></title>
            <link>https://velog.io/@changi_gg/%EB%B0%B1%EC%A4%80-Yonsei-TOTO-12018%EB%B2%88-JAVA</link>
            <guid>https://velog.io/@changi_gg/%EB%B0%B1%EC%A4%80-Yonsei-TOTO-12018%EB%B2%88-JAVA</guid>
            <pubDate>Fri, 14 Mar 2025 13:30:12 GMT</pubDate>
            <description><![CDATA[<h4 id="greedy--httpswwwacmicpcnetproblem12018-">Greedy ( <a href="https://www.acmicpc.net/problem/12018">https://www.acmicpc.net/problem/12018</a> )</h4>
<img src="https://velog.velcdn.com/images/changi_gg/post/7244831a-f877-489e-9e0e-c4414364f2d8/image.png" height="800px" width="800px">



<img src="https://velog.velcdn.com/images/changi_gg/post/ffcb61c2-cb72-402a-862c-602bc83cbc18/image.png" height="800px" width="800px">

<h3 id="풀이">풀이</h3>
<ul>
<li>먼저 최소한의 마일리지를 사용할 최소마일리지 배열, 최소한의 마일리지를 구할 마일리지 배열을 만들었다.</li>
<li>만약 수강신청인원 &lt; 수강신청할 수 있는 인원인 경우는 최소마일리지에 1을 저장 </li>
<li>만약 수강신청인원 &gt;= 수강신청할 수 있는 인원인 경우는 p-l 번쨰 마일리를 저장</li>
<li>최소한의 마일리지이므로 정렬 후 총 마일리지 m을 벗어나지 않는 경우에 answer를 증가 </li>
</ul>
<pre><code class="language-java">package problem_solving.greedy;

import java.util.Arrays;
import java.util.Scanner;

public class BaekJoon_12018 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = Integer.parseInt(sc.next());
        int m = Integer.parseInt(sc.next());
        int answer= 0 ; 
        int [] minMil = new int [n]; 
        int index = 0 ; 
        while(n--&gt; 0) {
            int p = Integer.parseInt(sc.next());
            int l = Integer.parseInt(sc.next());

            int [] miles = new int[p];

            for(int i = 0 ; i &lt;miles.length;i++) {
                miles[i] = Integer.parseInt(sc.next());
            }

            Arrays.sort(miles);

            if( l &gt; p) {
                minMil[index++]++;
            } else {
                minMil[index++]+=miles[p-l];
            }

        }

        Arrays.sort(minMil);
        int sum = 0 ; 
        for(int i = 0 ; i &lt; minMil.length; i++) {
            sum+=minMil[i];
            if( sum &gt; m) {
                break;
            }else {
                answer++;
            }

        }

        System.out.println(answer);
        sc.close();
    }

}
</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[SaaS ( Software as a Service ) 란? ]]></title>
            <link>https://velog.io/@changi_gg/SaaS-Software-as-a-Service-%EB%9E%80</link>
            <guid>https://velog.io/@changi_gg/SaaS-Software-as-a-Service-%EB%9E%80</guid>
            <pubDate>Wed, 12 Mar 2025 14:44:07 GMT</pubDate>
            <description><![CDATA[<h2 id="1-갑자기-saas-">1. 갑자기 Saas ?</h2>
<h4 id="회사에-입사해서-대표님이-신입사원들-전부-있을-때-saas란-뭔가에-대해-한마디로-표현해볼-수-있냐고-하셨다-이에-혼자-생각으로-전혀-대답을-못했다-java-sql-등-웹개발에-대한-프로그래밍언어-정말-간단한-cs만을-알고-요즘-클라우드-서비스가-더욱-부각-되는데-saas-라는-것에-대해-한마디로-표현하지-못하는게-조금은-양심에-찔렸다-😶-saas뿐-아니라-앞으로-다양한-것들을-정리해보자">회사에 입사해서 대표님이 신입사원들 전부 있을 때 SaaS란 뭔가에 대해 한마디로 표현해볼 수 있냐고 하셨다. 이에 혼자 생각으로 전혀 대답을 못했다.. Java, sql 등 웹개발에 대한 프로그래밍언어, 정말 간단한 cs만을 알고 요즘 클라우드 서비스가 더욱 부각 되는데 SaaS 라는 것에 대해 한마디로 표현하지 못하는게 조금은 양심에 찔렸다 😶 SaaS뿐 아니라 앞으로 다양한 것들을 정리해보자</h4>
<hr>
<h2 id="2-saas-란-">2. Saas 란 ?</h2>
<h4 id="saas-란-우선-한마디로-표현한다면-빌려쓰는-것-이라고-하셨다">SaaS 란 우선 한마디로 표현한다면 &quot;빌려쓰는 것&quot; 이라고 하셨다.</h4>
<h4 id="과거-모든-소프웨어는-각각의-pc에-설치해야-사용할-수-있는-것이었다-이런-경우-pc수가-당연히-늘어나고-관리하기도-어렵기-때문에-비용과-많은-제약사항이-있었다-이러한-문제점을-개선하고-보완하고자-saas라는-존재가-나타났다">과거 모든 소프웨어는 각각의 PC에 설치해야 사용할 수 있는 것이었다. 이런 경우 PC수가 당연히 늘어나고 관리하기도 어렵기 때문에 비용과 많은 제약사항이 있었다. 이러한 문제점을 개선하고 보완하고자 SaaS라는 존재가 나타났다.</h4>
<h4 id="saas는-흔히-우리가-쓰는-구글-gmail-구글-docs-등-많은-서비스-형태로-우리-주위에-제공되고-있다-이런-경우-pc에-소프트웨어를-설치하지-않아도-웹-로그인과-결제만-한다면-서비스를-이용할-수-있게-되었다">SaaS는 흔히 우리가 쓰는 구글 Gmail, 구글 docs 등 많은 서비스 형태로 우리 주위에 제공되고 있다. 이런 경우 PC에 소프트웨어를 설치하지 않아도 웹 로그인과 결제만 한다면 서비스를 이용할 수 있게 되었다.</h4>
<hr>
<h2 id="3-saas의-장점">3. SaaS의 장점</h2>
<h4 id="1-소프트웨어를-따로-설치-x">(1) 소프트웨어를 따로 설치 X</h4>
<h4 id="위에-말했듯-pc를-설치하고-소프트웨어를-따로-설치하지-않아도-노트북-핸드폰-등-자신의-기기에서-웹상에-로그인을-통해-필요한-서비스를-사용할-수-있다">위에 말했듯 PC를 설치하고 소프트웨어를 따로 설치하지 않아도 노트북, 핸드폰 등 자신의 기기에서 웹상에 로그인을 통해 필요한 서비스를 사용할 수 있다.</h4>
<h4 id="2-사용한만큼의-요금">(2) 사용한만큼의 요금</h4>
<h4 id="saas는-보통-자신이-월별-구독-기능을-통해-사용한만큼-과금이-일어난다-자신이-더이상-필요하지않다면-과금제를-끊어-서비스를-이용하지-않아도된다">SaaS는 보통 자신이 월별 구독 기능을 통해 사용한만큼 과금이 일어난다. 자신이 더이상 필요하지않다면 과금제를 끊어 서비스를 이용하지 않아도된다.</h4>
<h4 id="3-클라우드-저장으로-안정성이-높고-접근성이-자유롭다">(3) 클라우드 저장으로 안정성이 높고 접근성이 자유롭다</h4>
<h4 id="클릭-한-번으로-클라우드-저장소에-저장이되고-누구나-쉽게-접근할-수-있다는-장점이-있다">클릭 한 번으로 클라우드 저장소에 저장이되고 누구나 쉽게 접근할 수 있다는 장점이 있다.</h4>
<hr>
<h2 id="4-saas의-단점">4. SaaS의 단점</h2>
<h4 id="1-보안">(1) 보안</h4>
<h4 id="사실-보안문제는-어떤-서비스-어떤-플랫폼-어떤-어플이든-끊임없이-해결해야할-과제이다-누구나-접근할-수-있고-활용할-수-있는-saas라면-더욱-보안에-신경을-써야한다는-단점이-있는-것-같다">사실 보안문제는 어떤 서비스, 어떤 플랫폼, 어떤 어플이든 끊임없이 해결해야할 과제이다. 누구나 접근할 수 있고 활용할 수 있는 SaaS라면 더욱 보안에 신경을 써야한다는 단점이 있는 것 같다.</h4>
<h4 id="2-결국-빌려쓰는-것">(2) 결국 빌려쓰는 것</h4>
<h4 id="구글-gmail-구글-docs-등-결국-우리는-모두-구글에게-빌려쓰는-것이다-이러한면에서-만약-많은-업데이트가-일어나면-기존에-있던-기능들을-원치않게-못쓰게-되거나-다른이에게는-더욱-편리해지지만-나에게는-더욱-편리해지지-않을-수-있다는-단점이-있다-결국-서비스를-제공한-업체에게-의존하게-된다는-것이-장점이자-단점인-것-같다">구글 Gmail, 구글 docs 등 결국 우리는 모두 구글에게 빌려쓰는 것이다. 이러한면에서 만약 많은 업데이트가 일어나면 기존에 있던 기능들을 원치않게 못쓰게 되거나 다른이에게는 더욱 편리해지지만 나에게는 더욱 편리해지지 않을 수 있다는 단점이 있다. 결국 서비스를 제공한 업체에게 의존하게 된다는 것이 장점이자 단점인 것 같다.</h4>
<hr>
<p>공부 참고 출처 <a href="https://blog.naver.com/pentamkt/223166616282">https://blog.naver.com/pentamkt/223166616282</a> [ 하루 3분 공부 블로그 ] </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 수 이어 쓰기 ( 1515번, JAVA )]]></title>
            <link>https://velog.io/@changi_gg/%EB%B0%B1%EC%A4%80-%EC%88%98-%EC%9D%B4%EC%96%B4-%EC%93%B0%EA%B8%B0-1515%EB%B2%88-JAVA</link>
            <guid>https://velog.io/@changi_gg/%EB%B0%B1%EC%A4%80-%EC%88%98-%EC%9D%B4%EC%96%B4-%EC%93%B0%EA%B8%B0-1515%EB%B2%88-JAVA</guid>
            <pubDate>Wed, 12 Mar 2025 13:48:30 GMT</pubDate>
            <description><![CDATA[<h4 id="greedy--httpswwwacmicpcnetproblem1515-">Greedy ( <a href="https://www.acmicpc.net/problem/1515">https://www.acmicpc.net/problem/1515</a> )</h4>
<img src="https://velog.velcdn.com/images/changi_gg/post/17746d83-22b5-488e-9b20-3a4d0efec2ee/image.png" height="800px" width="800px">


<img src="https://velog.velcdn.com/images/changi_gg/post/5b64e64f-85eb-4c78-995a-64471719ece2/image.png" height="800px" width="800px">

<h3 id="풀이">풀이</h3>
<ul>
<li>먼저 입력에 있는 단어를 앞에서부터 체크해서 완성을 체크할 큐를 만들어서 각 자리를 넣어줬다.</li>
<li>처음엔 StringBuilder에 이어붙이면서 체크하려했는데 그런 것보다는 그냥 이어붙인 수 각 자리에 큐 힙 상단에 있는 숫자만 같아지면 뺄 수 있다고 생각을 했다 😎 이후 큐가 비어있다면 최소한의 숫자로 완성을 했다는 것이기 때문에 탈출 </li>
<li>큐를 사용한 가장 큰이유는 숫자가 예시처럼 ) 234092 일때 순차적으로 완성이 되야하기 때문</li>
</ul>
<pre><code class="language-java">package problem_solving.greedy;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class BaekJoon_1515 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String t = sc.next();
        Queue&lt;Character&gt; q = new LinkedList&lt;Character&gt;();

        for(int  i = 0 ; i &lt; t.length();i++) {
            q.offer(t.charAt(i));
        }
        int num = 1 ; 
        while(true) {
            String s  = Integer.toString(num);

            for(int i = 0 ; i &lt; s.length();i++) {
                if( q.peek() == s.charAt(i)) {
                    q.poll();
                }
                if( q.isEmpty()) {
                    System.out.println(num);
                    return ;
                }
            }
            num ++;
        }
    }

}
</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 블로그2 ( 20365번, JAVA )]]></title>
            <link>https://velog.io/@changi_gg/%EB%B0%B1%EC%A4%80-%EB%B8%94%EB%A1%9C%EA%B7%B82-20365%EB%B2%88-JAVA</link>
            <guid>https://velog.io/@changi_gg/%EB%B0%B1%EC%A4%80-%EB%B8%94%EB%A1%9C%EA%B7%B82-20365%EB%B2%88-JAVA</guid>
            <pubDate>Mon, 10 Mar 2025 13:37:11 GMT</pubDate>
            <description><![CDATA[<h4 id="greedy--httpswwwacmicpcnetproblem20365-">Greedy ( <a href="https://www.acmicpc.net/problem/20365">https://www.acmicpc.net/problem/20365</a> )</h4>
<img src="https://velog.velcdn.com/images/changi_gg/post/23857bb9-66fe-47ae-96b7-c0909a34bf2a/image.png" height="800px" width="800px">


<img src="https://velog.velcdn.com/images/changi_gg/post/6d78287c-2a04-49a2-984c-dd063b2fb891/image.png" height="800px" width="800px">


<h3 id="풀이">풀이</h3>
<ul>
<li>내가 생각한건 먼저 R 덩어리, B 덩어리 개수를 구하고 어차피 최대한 한 번에 그어버리고 더 작은 덩어리의 개수를 더하면 끝난다 ✔️</li>
</ul>
<pre><code class="language-java">package problem_solving.greedy;

import java.util.Arrays;
import java.util.Scanner;


public class BaekJoon_20365 {

    public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        int n = Integer.parseInt(sc.next());
        String s = sc.next();
        int rCnt = 0 ; 
        int bCnt = 0 ;
        String [] rArr = s.split(&quot;B&quot;);
        String [] bArr = s.split(&quot;R&quot;);

        for(int i = 0 ; i &lt; rArr.length;i++) {
            if( !rArr[i].equals(&quot;&quot;)) {
                rCnt++;
            }
        }

        for(int i = 0 ; i &lt; bArr.length;i++) {
            if( !bArr[i].equals(&quot;&quot;)) {
                bCnt++;
            }
        }
        System.out.println(Math.min(rCnt,bCnt)+1);

    }

}
</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 아시아 정보올림피아드 ( 2535번, JAVA )]]></title>
            <link>https://velog.io/@changi_gg/%EB%B0%B1%EC%A4%80-%EC%95%84%EC%8B%9C%EC%95%84-%EC%A0%95%EB%B3%B4%EC%98%AC%EB%A6%BC%ED%94%BC%EC%95%84%EB%93%9C-2535%EB%B2%88-JAVA</link>
            <guid>https://velog.io/@changi_gg/%EB%B0%B1%EC%A4%80-%EC%95%84%EC%8B%9C%EC%95%84-%EC%A0%95%EB%B3%B4%EC%98%AC%EB%A6%BC%ED%94%BC%EC%95%84%EB%93%9C-2535%EB%B2%88-JAVA</guid>
            <pubDate>Sun, 09 Mar 2025 10:31:39 GMT</pubDate>
            <description><![CDATA[<h4 id="sort--httpswwwacmicpcnetproblem2535-">sort ( <a href="https://www.acmicpc.net/problem/2535">https://www.acmicpc.net/problem/2535</a> )</h4>
<p><img src="https://velog.velcdn.com/images/changi_gg/post/7a9913f3-834e-40da-82d1-7a8b56e12bac/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/changi_gg/post/2d313503-68df-4a32-8a9c-56ebbf9f8b40/image.png" alt=""></p>
<h3 id="풀이">풀이</h3>
<ul>
<li>먼저 각 국가번호와 학생번호, 점수를 저장할 2차원배열을 선언</li>
<li>어차피 국가번호는 오름차순으로 준다고 했으니 정렬 x 정보 저장 후 점수를 기준으로 오름차순 정렬</li>
<li>난 당연히 해쉬맵에서 각각 카운트해서 동메달까지 ( count == 3 ) 이 되면 나오면 된다고 생각했는데 ( 물론 정답처리는 됨) 
근데 다른 사람 풀이를 보니까 엄청 간단하게 풀이했다.. 참고하자 ✔️</li>
<li>말그대로 각각 국가번호를 키로 주고 2개가 되면 continue 그게 아니라면 출력 후 국가 메달 증가</li>
</ul>
<pre><code class="language-java">package problem_solving.sort;

import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Scanner;

public class BaekJoon_2535 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n  = Integer.parseInt(sc.next());
        int [][] arr = new int [n][3];

        for(int i = 0 ; i &lt; arr.length; i++) {
            arr[i][0] = Integer.parseInt(sc.next());
            arr[i][1] = Integer.parseInt(sc.next());
            arr[i][2] = Integer.parseInt(sc.next());
        }
        Arrays.sort(arr, new Comparator&lt;int[]&gt;() {
            @Override
            public int compare(int [] o1, int[] o2 ) {
                return o2[2] - o1[2];
            }
        });

        HashMap&lt;Integer, Integer&gt; hm = new HashMap&lt;&gt;();
        int count = 0 ; 
        for(int i = 0 ; i &lt; arr.length;i++) {
            if( count == 3 ) {
                break;
            }
            if( !hm.containsKey(arr[i][0])) {
                hm.put(arr[i][0], 1);
                System.out.println(arr[i][0] + &quot; &quot; + arr[i][1]);
                count++;
            } else {
                if(hm.get(arr[i][0]) == 2 ) {
                    continue;
                } else {
                    int cnt = hm.get(arr[i][0]);
                    cnt+=1;
                    hm.put(arr[i][0],cnt );
                    System.out.println(arr[i][0] + &quot; &quot; + arr[i][1]);
                    count++;
                }

            }

        }

    }

}


</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 3개만! ( 17288번, JAVA )]]></title>
            <link>https://velog.io/@changi_gg/%EB%B0%B1%EC%A4%80-3%EA%B0%9C%EB%A7%8C-17288%EB%B2%88-JAVA</link>
            <guid>https://velog.io/@changi_gg/%EB%B0%B1%EC%A4%80-3%EA%B0%9C%EB%A7%8C-17288%EB%B2%88-JAVA</guid>
            <pubDate>Fri, 07 Mar 2025 09:26:35 GMT</pubDate>
            <description><![CDATA[<h4 id="string--httpswwwacmicpcnetproblem17288-">String ( <a href="https://www.acmicpc.net/problem/17288">https://www.acmicpc.net/problem/17288</a> )</h4>
<p><img src="https://velog.velcdn.com/images/changi_gg/post/1525e02c-daf9-4943-bc27-58e676b0c28a/image.png" alt=""></p>
<h3 id="풀이">풀이</h3>
<ul>
<li>먼저 비교를 위해 첫 번째 문자를 StringBuilder에 넣었다.</li>
<li>다음꺼부터 오름차순이 되어야함으로 앞값 == 뒤값-1 을 비교 // 만약 StringBuilder가 비어있다고 해도 비교할 첫 번째값을 넣어줘야함</li>
<li>이후 만약 오름차순 3개가 완성이된다면 cnt++ // StringBuilder를 비우고 다시 비교할 뒤에 값을 append() </li>
<li>만약 위에 반복문이 끝났는데 sb가 비어있지 않고 길이가 3이라면 cnt에 최종적으로 추가 // 아니라면 그대로 cnt 출력</li>
</ul>
<h3 id="오답이었던-이유">오답이었던 이유</h3>
<ul>
<li>여기서 조건을 sb.length() &gt; 0 으로 줘서 .. <pre><code class="language-java">if( sb.length() == 3  ) {
          System.out.println(cnt+1);
      } else {
          System.out.println(cnt);
      }</code></pre>
</li>
</ul>
<hr>
<pre><code class="language-java">package problem_solving.string;

import java.util.Scanner;

public class BaekJoon_17288 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();

        int cnt = 0 ;
        StringBuilder sb = new StringBuilder();
        sb.append(s.charAt(0));
        for(int i = 1 ; i&lt; s.length();i++) {
            if( s.charAt(i-1) ==  s.charAt(i)-1 || sb.length()==0) {
                sb.append(s.charAt(i));
            } else {
                if( sb.length() == 3 ) {
                    cnt++;
                    sb = new StringBuilder();
                    sb.append(s.charAt(i));
                }  else if( sb.length() &gt; 3 ) {
                    sb = new StringBuilder();
                    sb.append(s.charAt(i));
                }
            }
        }
        if( sb.length() == 3  ) {
            System.out.println(cnt+1);
        } else {
            System.out.println(cnt);
        }
    }

}

</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 알고리즘 수업 - 삽입 정렬 1 ( 24051번, JAVA )]]></title>
            <link>https://velog.io/@changi_gg/%EB%B0%B1%EC%A4%80-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%88%98%EC%97%85-%EC%82%BD%EC%9E%85-%EC%A0%95%EB%A0%AC-1-24051%EB%B2%88-JAVA</link>
            <guid>https://velog.io/@changi_gg/%EB%B0%B1%EC%A4%80-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%88%98%EC%97%85-%EC%82%BD%EC%9E%85-%EC%A0%95%EB%A0%AC-1-24051%EB%B2%88-JAVA</guid>
            <pubDate>Fri, 07 Mar 2025 07:23:31 GMT</pubDate>
            <description><![CDATA[<h4 id="sort--httpswwwacmicpcnetproblem24051-">sort ( <a href="https://www.acmicpc.net/problem/24051">https://www.acmicpc.net/problem/24051</a> )</h4>
<p><img src="https://velog.velcdn.com/images/changi_gg/post/e04538c8-9963-4ef4-816c-66d5179fd77a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/changi_gg/post/3551251d-7b1f-48b0-b795-ee607e68761b/image.png" alt=""></p>
<h3 id="풀이">풀이</h3>
<ul>
<li>삽입정렬 문제인데 처음엔 문제 이해하는게 좀 시간이 걸렸다 😂 </li>
<li>주어진 코드를 이용해서 중간에 제대로 이해했는지 확인하기위해 조건을 붙이는 문제다.. </li>
<li>먼저 문제에 주어진 코드로 입력을 하고 구현을 하려하니 막상 잘 되지 않았다.. 다른 사람의 풀이를 참고했다 </li>
<li>문제 핵심은 만약 loc 뒤에 배열값이 앞에 값과 스왑이 일어나면 그때 저장 1회를 증가시키고 저장하는 것 / 이때 만약 저장횟수와 문제에 주어진 K가 같다면 answer에 저장</li>
<li>만약 K가 저장횟수에 도달하지 못했다면 어차피 if문에 들어갈 수 없으니 answer는 -1을 출력</li>
<li>브론즈 1이라고 무시하지말고 기본기 탄탄히 다지자 ✔️</li>
</ul>
<pre><code class="language-java">package problem_solving.sort;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BaekJoon_24051 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());

        int[] A = new int[N];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i &lt; N; i++) {
            A[i] = Integer.parseInt(st.nextToken());
        }

        int cnt = 0 ; 
        int answer = -1; 
        for(int i = 1 ; i &lt; N ;i++) {
            int loc = i - 1;
            int newItem = A[i];
            while((0 &lt;= loc &amp;&amp; newItem &lt; A[loc])) {
                A[loc + 1] = A[loc];
                loc--;
                cnt++;
                if( cnt == K ) {
                    answer = A[loc+1] ; 
                }
            }

            if (loc + 1 != i) {
                A[loc + 1] = newItem;
                cnt++;
                if( cnt == K ) {
                    answer = A[loc+1];
                }
            }
        }
        System.out.println(answer);
    }

}


</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 팩토리얼 2( 27433번, JAVA )]]></title>
            <link>https://velog.io/@changi_gg/%EB%B0%B1%EC%A4%80-%ED%8C%A9%ED%86%A0%EB%A6%AC%EC%96%BC-2-27433%EB%B2%88-JAVA</link>
            <guid>https://velog.io/@changi_gg/%EB%B0%B1%EC%A4%80-%ED%8C%A9%ED%86%A0%EB%A6%AC%EC%96%BC-2-27433%EB%B2%88-JAVA</guid>
            <pubDate>Thu, 06 Mar 2025 04:39:19 GMT</pubDate>
            <description><![CDATA[<h4 id="math--httpswwwacmicpcnetproblem27433-">math ( <a href="https://www.acmicpc.net/problem/27433">https://www.acmicpc.net/problem/27433</a> )</h4>
<p><img src="https://velog.velcdn.com/images/changi_gg/post/714e675d-012e-4902-b376-8f839aecbadb/image.png" alt=""></p>
<h3 id="풀이">풀이</h3>
<ul>
<li>사실 브론즈5 문제라서 올릴까 했지만 🙄 기초문제이니 한문제씩 전부 다 정리해보자 🚀 </li>
<li>수학적으로 팩토리얼을 구현하기 때문에 원래 처음 자바를 했을때라면 for문을 활용했겠지만 이제 재귀에도 가까워보자 </li>
<li>fac 메소드를 호출 시 ex) n == 3 일때 </li>
<li>3 x fac(2) </li>
<li>3 x 2 x fac(1)</li>
<li><blockquote>
<p>결과적으로 스택에 쌓인 값들을 역으로 1 x 2 x 3 순서로 실행하여 반환</p>
</blockquote>
</li>
</ul>
<pre><code class="language-java">package problem_solving.math;

import java.util.Scanner;

public class BaekJoon_27433 {
    public static Long fac(Long n) {
        if( n == 1 || n == 0 ) {
            return (long) 1; 
        }else {
            return n * fac(n-1);
        }

    }

    public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        Long n = Long.parseLong(sc.next());
        System.out.println(fac(n));
    }


}

</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[ITSM / ITIL이란]]></title>
            <link>https://velog.io/@changi_gg/ITSM-ITIL%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@changi_gg/ITSM-ITIL%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Sun, 09 Feb 2025 08:49:33 GMT</pubDate>
            <description><![CDATA[<h2 id="1-itsm--it-service-management-">1. ITSM ( IT Service Management )</h2>
<h4 id="1-정의">(1) 정의</h4>
<h4 id="itsm이란-기업이나-조직에서-it서비스가-효과적이고-효율적으로-제공되도록-관리하는-방법론과-프로세스를-의미한다--결국-기업내에서-사용하는-mes시스템과-비슷한듯---결국-기업의-it서비스와-관련해서-모든-활동을-하는-시스템적-접근이고-서비스-제공-지원-유지보수-등-다양한-요소를-포함">ITSM이란 기업이나 조직에서 IT서비스가 효과적이고 효율적으로 제공되도록 관리하는 방법론과 프로세스를 의미한다. ( 결국 기업내에서 사용하는 MES시스템과 비슷한듯 ..? ) 결국 기업의 IT서비스와 관련해서 모든 활동을 하는 시스템적 접근이고 서비스 제공, 지원, 유지보수 등 다양한 요소를 포함</h4>
<h4 id="2-핵심-목표">(2) 핵심 목표</h4>
<h4 id="고객엑게-가치-있는-서비스를-제공하고-it운영을-최적화하여-비즈니스-목표를-달성하는-것">고객엑게 가치 있는 서비스를 제공하고, IT운영을 최적화하여 비즈니스 목표를 달성하는 것</h4>
<h4 id="주요-itsm-프로세스들">주요 ITSM 프로세스들</h4>
<ul>
<li>서비스 요청 관리 : 사용자가 서비스 요청을 제출하고, 이를 처리하는 프로세스</li>
<li>인시던트 관리 : IT서비스에서 발생한 문제를 신속하게 해결하는 프로세스</li>
<li>변경 ㅗ간리 : IT서비스와 인프라에서의 변화를 안전하고 효율적으로 관리하는 프로세스</li>
<li>문제 관리 : 인시던트의 근본 원인을 찾아 해결하는 프로세스</li>
<li>자산 및 구성 관리 : IT자원과 자산의 상태와 변화를 관리하는 프로세스</li>
</ul>
<hr>
<h2 id="2-itil--it-infrastructure-library-">2. ITIL ( IT Infrastructure Library )</h2>
<h4 id="1-정의-1">(1) 정의</h4>
<h4 id="it-서비스-관리의-모법-사례를-규명하고-이를-실현하기-위한-프레임워크를-제공">IT 서비스 관리의 모법 사례를 규명하고 이를 실현하기 위한 프레임워크를 제공</h4>
<h4 id="서비스-관리를-위한-명확한-프로세스와-절차를-제공하여-조직이-it-서비스를-효율적이고-일관되게-제공할-수-있도록-도와줌">서비스 관리를 위한 명확한 프로세스와 절차를 제공하여, 조직이 IT 서비스를 효율적이고 일관되게 제공할 수 있도록 도와줌</h4>
<p>-&gt; 일단 자바를 통해 편하게 웹개발을 하기 위해 스프링이 있듯이 ITSM을 구현하기 위해 ITIL이 있다고 생각하자 </p>
<h4 id="2-핵심-개념">(2) 핵심 개념</h4>
<ul>
<li>서비스 라이프사이클 : ITIL은 서비스 전 생애 주기를 관리 하는걸 강조 </li>
<li><blockquote>
<p>서비스 전략에서 시작해서 서비스 설계, 전환, 운영, 지속적인 서비스 개선까지 이어진다.</p>
</blockquote>
</li>
<li>서비스 전략 : IT 서비스가 조직의 목표와 전략에 부합하도록 정의</li>
<li>서비스 설계 : 서비스가 제공될 때 필요한 기줄적, 운영적 요구사항을 설계 </li>
<li>서비스 전환 : 새로운 서비스나 변경된 서비스가 실시간 환경에 배포되도록 관리</li>
<li>서비스 운영 : 일상적인 IT 서비스 운영으르 관리하여, 서비스 제공의 효율성을 높인다.</li>
<li>지속적인 서비스 개선 : 서비스 제공 과정에서 얻은 피드백을 바탕으로 지속적으로 개선</li>
<li><blockquote>
<p>결국 ITSM을 하기 위해 설계부터 ~ 구축 ~ 유지보수 전체적인 프로세르를 전부 한다는 느낌 ?</p>
</blockquote>
</li>
</ul>
<hr>
<h2 id="3-itsm과-itil의-관계">3. ITSM과 ITIL의 관계</h2>
<h4 id="1-간단한-내생각">(1) 간단한 내생각</h4>
<h4 id="그냥-itsm을-실현하기-위해-itil의-전반적인-프로세를-활용하여-itsm의-완벽을-추구-">그냥 ITSM을 실현하기 위해 ITIL의 전반적인 프로세를 활용하여 ITSM의 완벽을 추구 ?</h4>
<hr>
<h2 id="4-itsm과-itil을-도입하는-이유">4. ITSM과 ITIL을 도입하는 이유</h2>
<ul>
<li>서비스 품질 향상 : ITIL의 프로세스를 통해 서비스 품질을 지속적으로 개선하고, 사용자와 고객에게 제공하는 IT서비스를 최적화</li>
<li>비용 절감 : ITIL은 효율적인 자원 관리와 자동화를 통해 불필요한 비용을 절감</li>
<li>리스크 관리 : 체계적인 프로세스를 통해 변경과 문제를 관리하여 리스크 최소화</li>
<li>고객 만족도 향상 : 서비스 제공 프로세스를 개선하여 사용자 요구 사항에 신속하게 대응하고, 고객의 만족도를 높임</li>
</ul>
<hr>
<h2 id="5-궁금했던점">5. 궁금했던점</h2>
<h4 id="1-일반적-웹개발과-itsm-구축">(1) 일반적 웹개발과 ITSM 구축</h4>
<h4 id="itsm에-대해-알아보다가-내가-내린-결론은-티켓시스템의-차이--인-것-같다">ITSM에 대해 알아보다가 내가 내린 결론은 티켓시스템의 차이 ? 인 것 같다.</h4>
<h4 id="보통-지금까지-내가-해왔던-웹개발은-사용자와-관리자가-나누어져-있지만-대부분의-관점이-사용자에-맞춰져있다-예를-들어-웹개발은-사용자의-요청에-따라-설계된-로직이-처리되고-실시간으로-처리된다">보통 지금까지 내가 해왔던 웹개발은 사용자와 관리자가 나누어져 있지만 대부분의 관점이 사용자에 맞춰져있다. 예를 들어 웹개발은 사용자의 요청에 따라 설계된 로직이 처리되고 실시간으로 처리된다.</h4>
<h4 id="이와-비슷하지만-mes-시스템과-어떤-시스템이든---실무자의-요청---관리자가-확인-후-처리--이런식으로-단계적으로-처리되는-것들이-있다">이와 비슷하지만 MES 시스템과 어떤 시스템이든  ( 실무자의 요청 -&gt; 관리자가 확인 후 처리 ) 이런식으로 단계적으로 처리되는 것들이 있다.</h4>
<h4 id="웹개발보다는-사용자와-관리자의-입장을-명확하게-구분하고-사용자의-요청이-들어왔을-때-대부분-관리자가-요청을-확인하고-처리하는-것-이게-가장-큰-차이인-것-같다">웹개발보다는 사용자와 관리자의 입장을 명확하게 구분하고 사용자의 요청이 들어왔을 때 대부분 관리자가 요청을 확인하고 처리하는 것 이게 가장 큰 차이인 것 같다.</h4>
<h4 id="사용자의-초점--관리자의-초점">사용자의 초점 &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; 관리자의 초점</h4>
<h4 id="회사-다닐-때-휴가나-인사적-시스템-또한-hr시스템이지만-지금-내생각엔-이런-것들이-모두-itsm-범주내에-속하는게-아닐까-생각이-든다🙄">회사 다닐 때 휴가나 인사적 시스템 또한 HR시스템이지만 지금 내생각엔 이런 것들이 모두 ITSM 범주내에 속하는게 아닐까 생각이 든다🙄</h4>
<hr>
<h2 id="6-해봐야할-것">6. 해봐야할 것</h2>
<h4 id="자바스크립트랑-파이어베이스를-기반으로-간단한-사용자의-요청을-하고-관리자가-요청을-확인하고-처리하는-프로젝트를-만들어보자">자바스크립트랑 파이어베이스를 기반으로 간단한 사용자의 요청을 하고 관리자가 요청을 확인하고 처리하는 프로젝트를 만들어보자</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 - 시저 암호 ( JavaScript )]]></title>
            <link>https://velog.io/@changi_gg/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%8B%9C%EC%A0%80-%EC%95%94%ED%98%B8-JavaScript</link>
            <guid>https://velog.io/@changi_gg/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%8B%9C%EC%A0%80-%EC%95%94%ED%98%B8-JavaScript</guid>
            <pubDate>Sun, 09 Feb 2025 08:09:41 GMT</pubDate>
            <description><![CDATA[<h4 id="httpsschoolprogrammerscokrlearncourses30lessons12926languagejavascript"><a href="https://school.programmers.co.kr/learn/courses/30/lessons/12926?language=javascript">https://school.programmers.co.kr/learn/courses/30/lessons/12926?language=javascript</a></h4>
<img src="https://velog.velcdn.com/images/changi_gg/post/9de76827-fb4e-428c-a82e-f038bfe97903/image.png" height="600px" width="600px">



<h3 id="풀이">풀이</h3>
<ul>
<li>처음 보는 메소드들 정리</li>
<li>String.fromCharCode(i) -&gt; 숫자에 해당하는 아스키코드값을 문자열로 추출</li>
<li>char.charCodeAt(i) -&gt; 숫자에 해당하는 아스키코드값을 문자로  추출</li>
<li><blockquote>
<p>여기서 궁금했던게 왜 문자로 추출 후 다시 문자열로 추출하냐였다 .. 근데 이게 자바에서는 
(char) 숫자+숫자 이런식으로 해도 형변환으로 바로 추출할 수 있지만 자바스크립트는 이런 형변환이 존재하지않는다. 해서 두 번의 과정을 거쳐 문자열로 변환해서 문자열을 이었다. </p>
</blockquote>
</li>
<li><blockquote>
<p>결국 문제는 대문자라면 총 개수인 26을 활용해서 10진수 아스키코드값을 구하고 그걸 문자로 변환해서 문자열을 잇는 것 자바스크립트 메소드 기억하자 😎</p>
</blockquote>
</li>
</ul>
<pre><code class="language-java">function solution(s, n) {
 let answer = &quot;&quot;;

    for (let i = 0; i &lt; s.length; i++) {
        let char = s[i];

        if (char &gt;= &#39;A&#39; &amp;&amp; char &lt;= &#39;Z&#39;) {

            let newChar = String.fromCharCode(((char.charCodeAt(0) - 65 + n) % 26) + 65);
            answer += newChar;
        } else if (char &gt;= &#39;a&#39; &amp;&amp; char &lt;= &#39;z&#39;) {

            let newChar = String.fromCharCode(((char.charCodeAt(0) - 97 + n) % 26) + 97);
            answer += newChar;
        } else {
            answer += char;
        }
    }

    return answer;
}
</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[인턴 후 취준 마무리 😂]]></title>
            <link>https://velog.io/@changi_gg/%EC%9D%B8%ED%84%B4-%ED%9B%84-%EC%B7%A8%EC%A4%80-%EB%A7%88%EB%AC%B4%EB%A6%AC</link>
            <guid>https://velog.io/@changi_gg/%EC%9D%B8%ED%84%B4-%ED%9B%84-%EC%B7%A8%EC%A4%80-%EB%A7%88%EB%AC%B4%EB%A6%AC</guid>
            <pubDate>Mon, 03 Feb 2025 13:17:53 GMT</pubDate>
            <description><![CDATA[<h2 id="1-인턴-후-취준">1. 인턴 후 취준</h2>
<h4 id="10월18일부로-인턴이-끝나고-약-4개월간의-취준-끝에-다시-서울에-있는-괜찮은-회사에-취업하게-되었다-🚀🚀🚀-인턴을-하며-사람에-대한-힘듬과-인턴을-그만두고-4개월간-너무나도-많은일이-있었고-힘들었던-것-같다-다신-취준을-하고-싶지-않다는-생각이-강해졌다😥-이제-진짜-다시-시작이다-🙏🙏-물론-2주전-당진에가-차장님과-술한잔-하면서-신입사원-초봉인상-얘기와-내가-그만두고-난-후에-이야기들-차장님께서-아직도-그만둔게-아쉽다는-말씀을-해주시는걸-듣고-퇴사한-것이-더욱-아쉽다는-생각이-커지기도-했다-😢-하지만-갔다와서-3일뒤-합격발표를-받았으니-이제-미련은-다-버리고-지금-취업한-회사에-몰빵하자-😎-비록-중소기업이지만-회사의-전망도-itsm분야에서-1등이라-충분히-성장할-수-있는-회사라는-생각이-든다-또-면접때만-뵀지만-면접을-봐주셨던분들이-좋으신분들이고-배울-게-많을-것-같다는-느낌이-든다-🙄-다시-열심히-하는-사원이-되자-🏀">10월18일부로 인턴이 끝나고 약 4개월간의 취준 끝에 다시 서울에 있는 괜찮은 회사에 취업하게 되었다 🚀🚀🚀 인턴을 하며 사람에 대한 힘듬과 인턴을 그만두고 4개월간 너무나도 많은일이 있었고 힘들었던 것 같다.. 다신 취준을 하고 싶지 않다는 생각이 강해졌다😥 이제 진짜 다시 시작이다 🙏🙏 물론 2주전 당진에가 차장님과 술한잔 하면서 신입사원 초봉인상 얘기와 내가 그만두고 난 후에 이야기들, 차장님께서 아직도 그만둔게 아쉽다는 말씀을 해주시는걸 듣고 퇴사한 것이 더욱 아쉽다는 생각이 커지기도 했다 😢 하지만 갔다와서 3일뒤 합격발표를 받았으니 이제 미련은 다 버리고 지금 취업한 회사에 몰빵하자 😎 비록 중소기업이지만 회사의 전망도 ITSM분야에서 1등이라 충분히 성장할 수 있는 회사라는 생각이 든다.. 또 면접때만 뵀지만 면접을 봐주셨던분들이 좋으신분들이고 배울 게 많을 것 같다는 느낌이 든다 🙄 다시 열심히 하는 사원이 되자 🏀</h4>
<h2 id="2-이제부터-목표">2. 이제부터 목표</h2>
<h4 id="나는-itsm-분야의-회사에-취업을-했지만-사실-아직-itsm이-정확히-뭔지-노코드--로우코드-기반의-개발이-뭔지-면접을-보기-위해-공부를-했던-것-빼고는-잘-알지-못한다">나는 ITSM 분야의 회사에 취업을 했지만 사실 아직 ITSM이 정확히 뭔지, 노코드 / 로우코드 기반의 개발이 뭔지 면접을 보기 위해 공부를 했던 것 빼고는 잘 알지 못한다..</h4>
<h4 id="1-먼저-지금-오전-10시--19시까지-알바를-하니-끝나고-집에-와서-오늘처럼-노트북에-앉아-업무를-위한--공부를-해보자---흥미가-생기는-게-우선이다-🚗">(1) 먼저 지금 오전 10시 ~ 19시까지 알바를 하니 끝나고 집에 와서 오늘처럼 노트북에 앉아 업무를 위한 ? 공부를 해보자 - 흥미가 생기는 게 우선이다 🚗</h4>
<h4 id="2-집에-오면-가장-먼저-javascrpit-문법부터-다시-좀-익히자-학원다닐-때-혼자서-프로젝트를-진행할-때-ajax나-간단한-자바스크립트-문법들만-익혀왔으니-java를-처음-할-때처럼-남은-20일-가량-동안-프로그래머스-기초-문제들부터-자바스크립트-문법으로-풀어보자-자바의-함수들은-어차피-잊을-수-없다--내가-너무나도-많이-사용했기때문에-언제든-다시-사용할-수-있다-가령">(2) 집에 오면 가장 먼저 JavaScrpit 문법부터 다시 좀 익히자 학원다닐 때, 혼자서 프로젝트를 진행할 때 ajax나 간단한 자바스크립트 문법들만 익혀왔으니 Java를 처음 할 때처럼 남은 20일 가량 동안 프로그래머스 기초 문제들부터 자바스크립트 문법으로 풀어보자 자바의 함수들은 어차피 잊을 수 없다 .. 내가 너무나도 많이 사용했기때문에 언제든 다시 사용할 수 있다. 가령</h4>
<pre><code class="language-java">Integer.parseInt(); // Java
parseInt(); // JavaScrpit </code></pre>
<p>이런식으로 자바와 자바스크립트 문법 차이에 대해 다시 복습하고 자바스크립트에 다양한 메소드들을 활용해보자 ✔</p>
<h4 id="3-알바는-앞으로-7일만-더하고-그만하고-남은-시간동안-기초-문제들을-풀면서-간단한-자바스크립트-프로젝트를-하나-간단하게-만들어보자-이게-제일-좋은-방법✔-사실-이거-전에-해본-파이어베이스도-활용해서-뭐하나-해보면-좋을듯하다-😮">(3) 알바는 앞으로 7일만 더하고 그만하고 남은 시간동안 기초 문제들을 풀면서 간단한 자바스크립트 프로젝트를 하나 간단하게 만들어보자 (이게 제일 좋은 방법✔) 사실 이거 전에 해본 파이어베이스도 활용해서 뭐하나 해보면 좋을듯하다 😮</h4>
]]></description>
        </item>
    </channel>
</rss>