<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>먹보의 개발일지</title>
    <link>https://5ddugi.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 10 Apr 2026 18:47:11 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>먹보 개발자</managingEditor>
    <item>
      <title>Java8에는 어떤것들이 바뀌었나?</title>
      <link>https://5ddugi.tistory.com/159</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Java8이 출시하고 많은 변화를 겪었다고 하여 Java8을 기준으로 전 후를 알아보고 싶었다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span&gt;Lambda&amp;nbsp;expression(람다 표현식)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;Functional interface(함수형 인터페이스)&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;Default method(디폴트 메서드)&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;Stream(스트림)&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;Optional(옵셔널)&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;새롭게 추가된 날짜 API&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;CompletableFuture(컴플리터블&amp;nbsp;퓨처)&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;JVM의 변화&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. lambda 표현식&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java8때 출시한 lambda 표현식에 대해서 먼저 알아봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lambda가 탄생하게된 목적이 무엇일까? lambda 표현식이란 하나의 메소드를 하나의 식으로 표현한것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 저 한 문장이 이해가 안갔다. Java8이전에 있었던 '익명함수'라는 놈을 살펴보면 익명함수란 함수에 이름을 붙이이 않고 바로 정의해서 사용하는 방법인데&lt;/p&gt;
&lt;pre id=&quot;code_1746089770375&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Runnable oldWay = new Runnable() {
            @Override
            public void run() {
                System.out.println(&quot;익명클래스 방식&quot;);
            }
        };&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 구현체를 따로 생성하지 않고 인터페이스를 구현할 수 있었다. 하나의 함수인것이다. 또한 '일회용 함수'로서 유용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;익명함수의 존재와 목적을 알고나니 람다의 탄생과 목적이 조금이나마 이해가 갔다. 위의 코드에 나와있는것처럼 익명 내부클래스는 그 구성이 복잡해질수록 코드도 장황해져 함수처럼 간편하게 다루기가 힘들었다. 여기서 람다 표현식의 탄생이유가 이해되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1746090221357&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Runnable lambdaWay = () -&amp;gt; System.out.println(&quot;람다방식&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;람다 표현식을 사용하면 익명 클래스보다 훨씬 간결하고 가독성이 뛰어나다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 불필요한 반복코드 즉 보일러플레이트를 제거하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 함수형 인터페이스(추상 메서드를 하나만 가지고 있음)를 구현하기에 메서드의 매개변수로도, 반환값으로도 바로 전달할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 또한 코드를 읽을때 어떤 일을 하는 함수라는게 한눈에 파악 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;람다 표현식을 조금씩 파헤쳐보며 새로안 사실이 있었다. 위에서도 기입했지만 함수형 인터페이스만 가능하다는것. 즉 메서드가 두 개 이상 있는 인터페이스에서는 쓸 수 없고 일반 클래스나 추상 클래스에서는 쓸 수 없다는 사실도 처음 알았다. 사실 공부하며 '아니 람다가 있으면 더 이상 익명함수는 필요가 없겠네? 익명 함수에서 발전된거니까...?' 라고 느끼고 있었는데 람다 표현식을 쓸 수 없는 상황에는 익명함수로 쓸 수 있다는게 재밌었다. 더불어 익명함수에는 제약이 없다는것, 인터페이스 구현도 되고, 추상 클래스 상속도 된다는것 = &quot;람다가 쓰지 못하는 곳에서는 언제나 익명 내부 클래스로 대체할 수 있다.&quot; 라는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 함수형 인터페이스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자연스럽게 함수형 인터페이스로 넘어가서 함수형 인터페이스가 java8에 생겼나? 그건 아닌것같다. 정확히 말하자면 &quot;추상 메서드가 하나인 인터페이스&quot;는 만들 수 있었다. Java8부터 @FunctionalInterface 애너테이션을 통해 추상 메서드가 정확히 하나인지 컴파일러가 검증해주고, 람다 표현식과 스트림 API 같은 함수형 프로그래밍 요소들을 &lt;u&gt;함수형 인터페이스 전용&lt;/u&gt;으로 정의 할 수 있게 지원해줬다. 여기서 java개발자가 사용자들의 니즈(?)를 반영하려하는 마음이 크게 느껴졌다. 역시 무언가 생기기 까지의 과정과 배경 및 목적을 알았을때 프로그래밍의 재미가 더해지는것같다. 정리해보면 함수형 인터페이스는 &quot;추상메서드가 하나만 있는 인터페이스&quot;인것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 디폴트 메서드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;충격이었다. 디폴트 메서드가 Java8에 도입된 기능이라니. 이것을 모르고 java17부터 온갖 편한 기능이 다 있는 상태속 공부를 하기 시작했던 나는 당연한줄 알았던 디폴트 메서드가 원래 처음부터 있다고 생각했었다. 결국 Java7까지는 인터페이스의 모든 메서드가 추상 메서드였다는게 아닌가. 그렇다면 새로운 기능을 추가할 때 기존 인터페이스를 구현하고 있는 구현체들은 반드시 메서드를 오버라이딩해야하는 상황이 발생하는데 어허.. 이러면 불편한점이 반드시 생겼었을것같다. default 메서드는 인터페이스에 default 키워드를 붙여 기존 구현체를 건드리지 않고도 인터페이스에 메서드를 추가할 수 있게 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/자바(Java)</category>
      <author>먹보 개발자</author>
      <guid isPermaLink="true">https://5ddugi.tistory.com/159</guid>
      <comments>https://5ddugi.tistory.com/159#entry159comment</comments>
      <pubDate>Thu, 1 May 2025 18:41:44 +0900</pubDate>
    </item>
    <item>
      <title>Charmander - CICD 파이프라인 구축</title>
      <link>https://5ddugi.tistory.com/158</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. EC2 인스턴스 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. EC2 인스턴스 접속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Docker, Docker Compose 설치&lt;/p&gt;
&lt;pre id=&quot;code_1741860325150&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 패키지 업데이트
sudo yum update -y

# Docker 설치
sudo yum install -y docker

# Docker 데몬 시작
sudo service docker start

# (선택) 부팅 시 Docker 자동 시작
sudo systemctl enable docker

# ec2-user(또는 원하는 사용자)를 docker 그룹에 추가
sudo usermod -aG docker ec2-user&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1741860337707&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# (권장) 최신 버전 설치를 원한다면, GitHub 릴리스 페이지에서 버전 번호를 바꿔 사용하세요.
# https://github.com/docker/compose/releases

# 1) 바이너리 다운로드
sudo curl -L &quot;https://github.com/docker/compose/releases/download/2.33.1/docker-compose-$(uname -s)-$(uname -m)&quot; \
     -o /usr/local/bin/docker-compose

# 2) 실행 권한 부여
sudo chmod +x /usr/local/bin/docker-compose

# 3) (옵션) 편의를 위해 심볼릭 링크 생성
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. ECR 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Mutable&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;동일한 태그를 여러 번 덮어쓸 수 있는 모드.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;예: &lt;span&gt;latest&lt;/span&gt; 태그로 이미지를 한 번 푸시한 뒤, 다시 빌드된 이미지를 동일한 &lt;span&gt;latest&lt;/span&gt; 태그로 푸시하면 이전 이미지는 덮어쓰임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;CI/CD 파이프라인에서 항상 &lt;span&gt;latest&lt;/span&gt; 태그로 이미지를 올리는 식으로 손쉽게 사용할 수 있지만, 이미 존재하는 태그가 다른 이미지로 바뀔 수 있기 때문에, &amp;ldquo;태그가 가리키는 이미지가 시간에 따라 변할 수 있다&amp;rdquo;는 점에 유의해야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Immutable&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;한 번 푸시된 태그를 이후에 덮어쓸 수 없는 모드.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;예: &lt;span&gt;latest&lt;/span&gt; 태그로 이미지를 푸시한 후, 동일 태그(&lt;span&gt;latest&lt;/span&gt;)로 새 이미지를 푸시하려고 하면 오류가 발생하여 덮어쓸 수 없음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;운영/프로덕션 환경에서 특정 태그가 한 번 정해지면 절대로 바뀌지 않게 함으로써, &amp;ldquo;태그 = 특정 이미지&amp;rdquo;라는 불변성을 보장할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;하지만 매번 새 버전의 이미지를 푸시할 때마다 새 태그를 발행해야 하므로, 태그 관리가 다소 번거로울 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1.&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;AES-256 (기본 S3 서버 사이드 암호화, SSE-S3)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;bull;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;AWS가 기본적으로 제공하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;서버 사이드 암호화&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;방식.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;bull;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;별도의 KMS(Key Management Service) 키를 사용하지 않고, AWS가 자동으로 관리하는 키로 데이터를 암호.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;bull;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;설정이 간단하고 추가 비용 없이 사용 가능.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;bull;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;하지만 고객이 직접 키를 관리하거나, 세부적인 키 정책을 설정하기는 어려움.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2.&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;AWS KMS (SSE-KMS)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;bull;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;AWS Key Management Service(KMS)에서 제공하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;고객 관리형 키&lt;/b&gt;&lt;/span&gt;(CMK) 또는 AWS 관리형 키를 사용해 암호화함.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;bull;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;세부적인 키 제어, 키 정책, 접근 권한&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;등을 설정할 수 있으며,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;키 회전&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;등을 통한 보안 강화를 할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;bull;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;다만 KMS 사용에 따른&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;소정의 비용&lt;/b&gt;&lt;/span&gt;이 발생할 수 있으며, KMS 권한/정책을 잘 설정해야 함.&lt;/p&gt;</description>
      <author>먹보 개발자</author>
      <guid isPermaLink="true">https://5ddugi.tistory.com/158</guid>
      <comments>https://5ddugi.tistory.com/158#entry158comment</comments>
      <pubDate>Thu, 13 Mar 2025 19:19:16 +0900</pubDate>
    </item>
    <item>
      <title>Redis 개요</title>
      <link>https://5ddugi.tistory.com/157</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;980&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/leHJE/btsMCyCgET3/cj8wafJdyIuNO3fsOCQdd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/leHJE/btsMCyCgET3/cj8wafJdyIuNO3fsOCQdd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/leHJE/btsMCyCgET3/cj8wafJdyIuNO3fsOCQdd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FleHJE%2FbtsMCyCgET3%2Fcj8wafJdyIuNO3fsOCQdd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1188&quot; height=&quot;980&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;980&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>DB</category>
      <author>먹보 개발자</author>
      <guid isPermaLink="true">https://5ddugi.tistory.com/157</guid>
      <comments>https://5ddugi.tistory.com/157#entry157comment</comments>
      <pubDate>Thu, 6 Mar 2025 11:45:16 +0900</pubDate>
    </item>
    <item>
      <title>shoplink - 모니터링 시스템 구축 (prometheus + grafana)</title>
      <link>https://5ddugi.tistory.com/156</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. Spring Boot 애플리케이션에 Prometheus 메트릭 내보내기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.1. 의존성 추가&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) Spring Boot Actuator - &lt;/b&gt;애플리케이션의 다양한 지표(헬스 체크, 정보, 메트릭 등)를 제공하는 핵심 라이브러리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) Micrometer Registry Prometheus - &lt;/b&gt;Micrometer를 통해 Actuator에서 수집한 메트릭을 Prometheus가 이해할 수 있는 형태로 노출&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMmzLN/btsMpo0NIdP/U5kSRPnc8SdJNL3s4hY3l1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMmzLN/btsMpo0NIdP/U5kSRPnc8SdJNL3s4hY3l1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMmzLN/btsMpo0NIdP/U5kSRPnc8SdJNL3s4hY3l1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMmzLN%2FbtsMpo0NIdP%2FU5kSRPnc8SdJNL3s4hY3l1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;562&quot; height=&quot;50&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;50&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.2. 설정 파일(yml) 변경&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;application.yml(혹은 application.properties)에서 Actuator 엔드포인트 설정 해주기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prometheus가 수집할 수 있도록 /actuator/prometheus 엔드포인트를 공개해야 함&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;server:
  port: 8080

management:
  endpoints:
    web:
      exposure:
        include: &quot;*&quot;
  endpoint:
    prometheus:
      access: unrestricted&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; include: &quot;*&quot;를 하면 모든 Actuator 엔드포인트가 열리지만, 보안 혹은 내부 운영 정책에 따라 필요한 엔드포인트만 열어주는 것이 좋음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.3. 애플리케이션 실행 후 확인&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 실행한 뒤, 웹 브라우저 혹은 cURL을 통해 다음 URL로 접속.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://localhost:8080/actuator/prometheus&quot;&gt;http://localhost:8080/actuator/prometheus&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xXuQJ/btsMpKo0INo/8IOiO98lf4Bv5oy681IPBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xXuQJ/btsMpKo0INo/8IOiO98lf4Bv5oy681IPBk/img.png&quot; data-alt=&quot;위의 사진과 같이 뜨면 접속 성공&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xXuQJ/btsMpKo0INo/8IOiO98lf4Bv5oy681IPBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxXuQJ%2FbtsMpKo0INo%2F8IOiO98lf4Bv5oy681IPBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;842&quot; height=&quot;72&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위의 사진과 같이 뜨면 접속 성공&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. Prometheus 설정 및 실행&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Boot 애플리케이션에서 /actuator/prometheus를 통해 지표가 잘 노출되는지 확인했다면, 이제 Prometheus 서버가 해당 엔드포인트를 스크레이핑하도록 설정해야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.1. Prometheus 다운로드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prometheus 공식 GitHub Releases 페이지에서 OS/아키텍처에 맞는 버전을 다운로드 하기. (필자는 Mac)&lt;/p&gt;
&lt;pre id=&quot;code_1740021989432&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#다운로드
wget https://github.com/prometheus/prometheus/releases/download/v2.42.0/prometheus-2.42.0.darwin-arm64.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1740022035661&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#압축해제
tar xvfz prometheus-2.42.0.darwin-arm64.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1740022142416&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#해당폴더 이동
cd prometheus-2.42.0.darwin-arm64&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.2. Prometheus 설정 파일(prometheus.yml) 편집&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;압축을 해제하면 &lt;span&gt;prometheus.yml&lt;/span&gt; 파일이 함께 제공되는데, 아래처럼 &lt;span&gt;&lt;b&gt;Spring Boot 애플리케이션&lt;/b&gt;&lt;/span&gt;을 스크랩하도록 설정을 추가하기.&lt;/p&gt;
&lt;pre id=&quot;code_1740026151636&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - &quot;first_rules.yml&quot;
  # - &quot;second_rules.yml&quot;

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=&amp;lt;job_name&amp;gt;` to any timeseries scraped from this config.
  - job_name: &quot;shoplink&quot;
    scrape_interval: 15s

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
    metrics_path: &quot;/actuator/prometheus&quot;
    static_configs:
      - targets: [&quot;localhost:8080&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.3. Prometheus 서버 실행&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740028580272&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#프로메테우스 서버 실행
./prometheus --config.file=prometheus.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;실행 로그를 보면 설정이 제대로 로드되었는지, 스크레이핑 대상에 제대로 접근되고 있는지를 확인할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;웹브라우저에서 &lt;a href=&quot;http://localhost:9090&quot;&gt;http://localhost:9090&lt;/a&gt; 으로 접속해 &lt;span&gt;Status -&amp;gt; Targets&lt;/span&gt; 메뉴로 이동하면, &lt;span&gt;UP&lt;/span&gt; 상태인지 확인이 가능함.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2342&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eciTkK/btsMo5HyZWi/bDmflvrD2kBnNgfUipkZek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eciTkK/btsMo5HyZWi/bDmflvrD2kBnNgfUipkZek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eciTkK/btsMo5HyZWi/bDmflvrD2kBnNgfUipkZek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeciTkK%2FbtsMo5HyZWi%2FbDmflvrD2kBnNgfUipkZek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2342&quot; height=&quot;336&quot; data-origin-width=&quot;2342&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. Grafana로 데이터 시각화&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3.1. Grafana 다운로드/설치&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740028230152&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#다운로드
curl -O https://dl.grafana.com/enterprise/release/grafana-enterprise-11.5.2.darwin-amd64.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1740028291906&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#압축해제
tar -zxvf grafana-enterprise-11.5.2.darwin-amd64.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1740028379780&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#해당폴더 이동
cd grafana-v11.5.2&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1740028522821&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#그라파나 서버 실행
./bin/grafana server&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3.2. Grafana 첫 접속 및 Prometheus 데이터 소스 추가&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;1)&lt;span&gt;&amp;nbsp;&lt;/span&gt;웹 브라우저에서 &lt;a href=&quot;http://localhost:3000&quot;&gt;http://localhost:3000&lt;/a&gt; 접속.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;2)&lt;span&gt;&amp;nbsp;&lt;/span&gt;기본 아이디/비밀번호: &lt;span&gt;admin / admin&lt;/span&gt; (최초 로그인 시 비밀번호 변경해야 할 수 있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;3)&lt;span&gt;&amp;nbsp;&lt;/span&gt;좌측 사이드바에서 &lt;/span&gt;&lt;b&gt;Connections -&amp;gt; Data Sources&lt;/b&gt;&lt;span&gt; 선택&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;4)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Add data source&lt;/b&gt;&lt;span&gt; 버튼 클릭&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;5)&lt;span&gt;&amp;nbsp;&lt;/span&gt;목록에서 &lt;/span&gt;&lt;b&gt;Prometheus&lt;/b&gt;&lt;span&gt;를 선택&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;6)&lt;span&gt;&amp;nbsp;&lt;/span&gt;Prometheus URL 예시: &lt;/span&gt;http://localhost:9090&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;7) &lt;span&gt;&lt;b&gt;Save &amp;amp; Test&lt;/b&gt;&lt;/span&gt; 버튼을 눌러 성공 여부 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crHC3h/btsMqNTdox3/HapPjRm2qacGKRT5IBTNpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crHC3h/btsMqNTdox3/HapPjRm2qacGKRT5IBTNpK/img.png&quot; data-origin-width=&quot;301&quot; data-origin-height=&quot;510&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;23.19&quot; style=&quot;width: 22.9231%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crHC3h/btsMqNTdox3/HapPjRm2qacGKRT5IBTNpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrHC3h%2FbtsMqNTdox3%2FHapPjRm2qacGKRT5IBTNpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;301&quot; height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOwiXN/btsMo07AG9s/49bovYHRKX3USjed3ju0W1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOwiXN/btsMo07AG9s/49bovYHRKX3USjed3ju0W1/img.png&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;286&quot; data-is-animation=&quot;false&quot; style=&quot;width: 75.9141%;&quot; data-widthpercent=&quot;76.81&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOwiXN/btsMo07AG9s/49bovYHRKX3USjed3ju0W1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOwiXN%2FbtsMo07AG9s%2F49bovYHRKX3USjed3ju0W1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;559&quot; height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zh6sx/btsMqhHioJr/QWmQrJGabTVk3sGIpl8Fz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zh6sx/btsMqhHioJr/QWmQrJGabTVk3sGIpl8Fz1/img.png&quot; data-origin-width=&quot;1059&quot; data-origin-height=&quot;540&quot; data-is-animation=&quot;false&quot; style=&quot;width: 35.3751%; margin-right: 10px;&quot; data-widthpercent=&quot;35.79&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zh6sx/btsMqhHioJr/QWmQrJGabTVk3sGIpl8Fz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZh6sx%2FbtsMqhHioJr%2FQWmQrJGabTVk3sGIpl8Fz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1059&quot; height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ljZir/btsMpmvHnW5/yIb6CkrPt6kRlWlY2TGW40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ljZir/btsMpmvHnW5/yIb6CkrPt6kRlWlY2TGW40/img.png&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;220&quot; data-is-animation=&quot;false&quot; style=&quot;width: 63.4621%;&quot; data-widthpercent=&quot;64.21&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ljZir/btsMpmvHnW5/yIb6CkrPt6kRlWlY2TGW40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FljZir%2FbtsMpmvHnW5%2FyIb6CkrPt6kRlWlY2TGW40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;774&quot; height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3.3. 대시보드 만들기&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prometheus 데이터를 Grafana에서 시각화하기 위해 새 대시보드를 만들기.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Create -&amp;gt; Dashboard&lt;/b&gt;&lt;span&gt; 클릭&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Add new panel&lt;/b&gt;&lt;span&gt; 클릭&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;3.&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;Query&lt;/b&gt;&lt;/span&gt; 부분에서 &lt;span&gt;&lt;b&gt;Prometheus&lt;/b&gt;&lt;/span&gt; 데이터 소스 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;4.&lt;span&gt; &lt;/span&gt;예시:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;CPU 사용량(단순 예시): &lt;/span&gt;rate(process_cpu_seconds_total[1m])&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;JVM Heap 사용률: &lt;/span&gt;jvm_memory_used_bytes{area=&quot;heap&quot;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;HTTP 요청 수: &lt;/span&gt;sum by (uri, method) (rate(http_server_requests_seconds_count[1m]))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;5.&lt;span&gt; &lt;/span&gt;그래프가 표시되는지 확인 후, &lt;span&gt;&lt;b&gt;Save&lt;/b&gt;&lt;/span&gt; 버튼을 눌러 대시보드를 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;Spring Boot Actuator + Micrometer는 JVM 메모리, GC, 스레드, HTTP 요청, DB Connection Pool 등 다양한 지표를 기본적으로 노출함. 실제 운영 환경에서는 필요한 정보를 골라서 시각화하면 됨.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDnIBw/btsMpMAVs1f/d5STXGx5nKPfrlqBkwjiK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDnIBw/btsMpMAVs1f/d5STXGx5nKPfrlqBkwjiK1/img.png&quot; data-origin-width=&quot;301&quot; data-origin-height=&quot;298&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.5944%; margin-right: 10px;&quot; data-widthpercent=&quot;32.98&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDnIBw/btsMpMAVs1f/d5STXGx5nKPfrlqBkwjiK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDnIBw%2FbtsMpMAVs1f%2Fd5STXGx5nKPfrlqBkwjiK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;301&quot; height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMeww6/btsMo1MiRbJ/lzzilQNVDyNhdNOkX39ciK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMeww6/btsMo1MiRbJ/lzzilQNVDyNhdNOkX39ciK/img.png&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;625&quot; data-is-animation=&quot;false&quot; style=&quot;width: 66.2428%;&quot; data-widthpercent=&quot;67.02&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMeww6/btsMo1MiRbJ/lzzilQNVDyNhdNOkX39ciK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMeww6%2FbtsMo1MiRbJ%2FlzzilQNVDyNhdNOkX39ciK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1283&quot; height=&quot;625&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3Eck8/btsMoXwjTdc/41Vs6MCfKYkGzERflXr5z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3Eck8/btsMoXwjTdc/41Vs6MCfKYkGzERflXr5z0/img.png&quot; style=&quot;width: 60.267%; margin-right: 10px;&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;274&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;60.98&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3Eck8/btsMoXwjTdc/41Vs6MCfKYkGzERflXr5z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3Eck8%2FbtsMoXwjTdc%2F41Vs6MCfKYkGzERflXr5z0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;937&quot; height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YKgnx/btsMqBlhm41/QcpML6R4RhPGj5QVI2kCzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YKgnx/btsMqBlhm41/QcpML6R4RhPGj5QVI2kCzK/img.png&quot; style=&quot;width: 38.5702%;&quot; data-origin-width=&quot;1915&quot; data-origin-height=&quot;875&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;39.02&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YKgnx/btsMqBlhm41/QcpML6R4RhPGj5QVI2kCzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYKgnx%2FbtsMqBlhm41%2FQcpML6R4RhPGj5QVI2kCzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1915&quot; height=&quot;875&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1977&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxdPVm/btsMqya7DPq/xc4F8KQ5ySHk8YJpFrOilk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxdPVm/btsMqya7DPq/xc4F8KQ5ySHk8YJpFrOilk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxdPVm/btsMqya7DPq/xc4F8KQ5ySHk8YJpFrOilk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxdPVm%2FbtsMqya7DPq%2Fxc4F8KQ5ySHk8YJpFrOilk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1977&quot; height=&quot;444&quot; data-origin-width=&quot;1977&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 구축 흐름 요약&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;1)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Spring Boot 애플리케이션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;spring-boot-starter-actuator&lt;span&gt;, &lt;/span&gt;micrometer-registry-prometheus&lt;span&gt; 의존성 추가&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;/actuator/prometheus&lt;span&gt;로 메트릭 노출&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2)&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Prometheus&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;span&gt;prometheus.yml&lt;/span&gt;에서 Spring Boot 애플리케이션의 메트릭 엔드포인트 설정 (예: &lt;span&gt;localhost:8080&lt;/span&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Prometheus 서버 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Grafana&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Prometheus를 데이터 소스로 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;원하는 메트릭을 쿼리하여 대시보드 생성/시각화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. 추가 고려사항&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;1)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;보안&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/actuator/prometheus&lt;/span&gt; 엔드포인트에 인증/인가가 필요한지 여부를 검토해야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;운영 환경이라면 HTTPS 적용 여부, Prometheus-&amp;gt;애플리케이션 통신 제한(IP 화이트리스트 등)도 고려대상.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2)&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;프로메테우스 스크레이핑 주기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scrape_interval&lt;/span&gt;은 너무 짧으면 Prometheus 서버 부하가 커지고, 너무 길면 모니터링 응답성이 떨어짐.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;일반적으로 15초 ~ 1분 사이 정도가 많이 쓰이는 설정.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;대시보드 템플릿&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Spring Boot + Prometheus를 위한 &lt;span&gt;&lt;b&gt;Grafana 대시보드 템플릿&lt;/b&gt;&lt;/span&gt;이 이미 오픈소스 커뮤니티나 Grafana Labs에서 공유됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;필요한 템플릿을 가져와서 커스터마이징하면 빠르게 구축 가능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;4)&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;알람(Alerts)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Prometheus에는 Alertmanager 연동을 통해 특정 지표가 임계값을 넘었을 때 Slack/이메일/Webhook 등으로 알람을 보낼 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Grafana의 Alerting 기능으로도 대시보드 기반 알람을 설정할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;5)&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;운영 환경 배포&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Docker Compose나 Kubernetes를 사용하면 &lt;span&gt;&lt;b&gt;Spring Boot + Prometheus + Grafana&lt;/b&gt;&lt;/span&gt;를 한꺼번에 쉽게 구성할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;각 컨테이너를 분리하여 유지보수/확장이 용이함.&lt;/p&gt;</description>
      <author>먹보 개발자</author>
      <guid isPermaLink="true">https://5ddugi.tistory.com/156</guid>
      <comments>https://5ddugi.tistory.com/156#entry156comment</comments>
      <pubDate>Thu, 20 Feb 2025 12:10:50 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 토이프로젝트3 쇼핑몰 잡화 서비스 회고</title>
      <link>https://5ddugi.tistory.com/155</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt;회고할 내용&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt;1. 개발문화정립&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt;2. LLM경험&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 개발문화정립&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt;약 2주간의 토이프로젝트가 2월 4일 발표를 기점으로 끝이 났다. 이번 프로젝트에서 가장 인상깊었던 부분은 개발 문화에 대한 정립이었는데, &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt;이전 프로젝트에서 개발 프로세스에 여러 문제점을 느낀 한 팀원분이 좋은 개발 문화를 정립하는데 큰 기여를 해주셨는다. 특히 그 부분이 프로젝트 진행에 있어 크나큰 도움이 됐다. 팀원 분께서 느낀 (전)프로젝트의 문제점은 세가지였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt;1. 한 PR의 많은 커밋&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt;2. 잦은 충돌&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt;3. 대기 / 병목으로 인한 효율 저하&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;489&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxOkXp/btsL8N7B4CC/9faC471MG540rVbhrXknV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxOkXp/btsL8N7B4CC/9faC471MG540rVbhrXknV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxOkXp/btsL8N7B4CC/9faC471MG540rVbhrXknV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxOkXp%2FbtsL8N7B4CC%2F9faC471MG540rVbhrXknV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;669&quot; height=&quot;274&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;489&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제점을 다음과 같이 수정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 하나의 PR에는 최소한의 코드만 작성 / 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 개발하는 시간 이외에 충돌 문제를 해결하는 시간 줄이기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 목표를 수치화&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eRJfB7/btsL8NsZizD/kHuPtcKsKUue201R9CEGC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eRJfB7/btsL8NsZizD/kHuPtcKsKUue201R9CEGC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eRJfB7/btsL8NsZizD/kHuPtcKsKUue201R9CEGC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeRJfB7%2FbtsL8NsZizD%2FkHuPtcKsKUue201R9CEGC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;669&quot; height=&quot;266&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;481&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 부트 오픈소스나 다른 이름있는 프로젝트들의 깃헙 협업 방식을 참고하여 개발 협업과정이 원활히 진행 될 수 있도록 설계했다.&amp;nbsp;그 결과 사진에도 볼 수 있듯이 초반에는 복잡하고 여러개의 브랜치가 merge되었으나 후반부로 갈 수록 브랜치가 잘 정리되어있고 흐름이 단순화 되어있는것을 확인할 수 있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;619&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9INuv/btsL8mv0Ysn/cwMGpyaYpA4YM4p9ualfM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9INuv/btsL8mv0Ysn/cwMGpyaYpA4YM4p9ualfM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9INuv/btsL8mv0Ysn/cwMGpyaYpA4YM4p9ualfM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9INuv%2FbtsL8mv0Ysn%2FcwMGpyaYpA4YM4p9ualfM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;619&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;619&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. LLM모델을 활용한 챗봇 서비스 개발&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt;Fast API를 활용한 OpenAI 챗봇 개발이 주제였고 LLM을 활용한 챗봇서비스는 처음 접하는 주제였다. 여러 강사님께서 특강을 해주실때 RAG에 대한 부분을 언급해주셨고 할루시네이션을 일으키고 전문성이 부족한 LLM모델이 RAG와 결합될 때 기존에 발생하는 LLM의 문제를 어느정도 해소할 수 있다는 내용으로 받아들였다. 따라 나는 RAG를 기반으로한 LLM챗봇서비스를 개발하려했고 서&lt;/span&gt;비스 개발을 위해 youtube GPTers에 있는 이상연님의 영상에 나오는 RAG구조를 참고했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;참고 youtube&quot; href=&quot;https://www.youtube.com/watch?v=m7cNjCVpSrw&amp;amp;t=234s&amp;amp;ab_channel=GPTers%EC%BB%A4%EB%AE%A4%EB%8B%88%ED%8B%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=m7cNjCVpSrw&amp;amp;t=234s&amp;amp;ab_channel=GPTers%EC%BB%A4%EB%AE%A4%EB%8B%88%ED%8B%B0&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고한 영상을 바탕으로 아래와 같은 RAG 기반 LLM application 구조를 설계했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1255&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QRM4G/btsL8b8mo2v/fXPvczzG30KzwR9MdwoeAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QRM4G/btsL8b8mo2v/fXPvczzG30KzwR9MdwoeAK/img.png&quot; data-alt=&quot;토이프로젝트 잡화몰 챗봇서비스 RAG 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QRM4G/btsL8b8mo2v/fXPvczzG30KzwR9MdwoeAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQRM4G%2FbtsL8b8mo2v%2FfXPvczzG30KzwR9MdwoeAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1255&quot; height=&quot;600&quot; data-origin-width=&quot;1255&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;토이프로젝트 잡화몰 챗봇서비스 RAG 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잡화 쇼핑몰이 주제였기에 크롤링을 담당하신 팀원분께서 데이터를 스크랩해주셨고, 그 데이터를 바탕으로 벡터db에 저장시킬 docx파일을 만들었다. upstage는 회원가입을 하면 10달러짜리 api key를 제공해주기에 upstage를 사용했고 임베딩 모델과 ai 언어 모델은 upstage에서 제공해주는 모델을 사용했다. 구조에서 나와있듯이 쇼핑몰 데이터를 먼저 임베딩화 시켜 벡터db에 저장하고 사용자의 질문이 컨텍스트를 통해 입력되었을때 사용자의 질문을 임베딩해서 벡터화 되어있는 쇼핑몰 데이터 정보와 유사도 검색을 한다(코사인 유사도 검색으로 되어있다. 코사인 유사도 검색은 벡터의 각도로 유사도 측정하는 것이다.) 이렇게 사용자의 질문과 검색결과 N개(나는 4개로 설정했다.)를 포함해 AI 언어모델에 전달하고 모델은 입력 토큰과 검색 결과를 바탕으로 답변을 생성하게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1587&quot; data-origin-height=&quot;961&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYw76p/btsL99iY1Xn/wcAZdNkW7pXHHTr25IYm70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYw76p/btsL99iY1Xn/wcAZdNkW7pXHHTr25IYm70/img.png&quot; data-alt=&quot;시연 영상 중 한 장면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYw76p/btsL99iY1Xn/wcAZdNkW7pXHHTr25IYm70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYw76p%2FbtsL99iY1Xn%2FwcAZdNkW7pXHHTr25IYm70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;670&quot; height=&quot;406&quot; data-origin-width=&quot;1587&quot; data-origin-height=&quot;961&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시연 영상 중 한 장면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>회고</category>
      <author>먹보 개발자</author>
      <guid isPermaLink="true">https://5ddugi.tistory.com/155</guid>
      <comments>https://5ddugi.tistory.com/155#entry155comment</comments>
      <pubDate>Wed, 5 Feb 2025 13:46:04 +0900</pubDate>
    </item>
    <item>
      <title>IoC 디자인 원칙과 스프링 프레임워크</title>
      <link>https://5ddugi.tistory.com/153</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;IoC는 디자인 원칙이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 프레임워크는 IoC디자인 원칙을 따르고 있다. IoC 원칙을 구현하기 위해 스프링은 *IoC컨테이너를 제공하고 이 컨테이너의 핵심 인터페이스는 BeanFactory이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*(IoC컨테이너는 실제 구현되어있는 클래스나 인터페이스가 아닌 개념에 가깝다. IoC컨테이너를 제공한다는것은 IoC컨테이너라는 개념을 구현한 실제 인터페이스와 구현체를 제공한다는 것이다.)&lt;br /&gt;스프링에서 제공하는 대표적인 IoC 컨테이너에는 BeanFactory라는 인터페이스가 있다. IoC 원칙을 적용해서 객체 생성, 의존성 주입, 빈 생명주기 관리 등을 수행한다. 가장 기본적인 스프링 IoC컨테이너이자, 경량 컨테이너이다. 이 인터페이스의 대표적인 구현체로는 DefaultListableBeanFactory가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로는 BeanFactory를 확장시킨 ApplicationContext라는 인터페이스가 있다. BeanFactory의 모든 기능과 추가 기능을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 애플리케이션에서는 대부분 ApplicationContext를 사용한다. 이 인터페이스의 구현체로는 ClassPathXmlApplicationContext, FileSystemXmlApplicationContext, AnnotationConfigApplicationContext,&amp;nbsp;&lt;span&gt;WebApplicationContext등이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/Spring</category>
      <author>먹보 개발자</author>
      <guid isPermaLink="true">https://5ddugi.tistory.com/153</guid>
      <comments>https://5ddugi.tistory.com/153#entry153comment</comments>
      <pubDate>Sat, 11 Jan 2025 03:17:20 +0900</pubDate>
    </item>
    <item>
      <title>자바에서 가장 많이 호출되는것은 무엇일까</title>
      <link>https://5ddugi.tistory.com/152</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;자바에서 &lt;b&gt;가장 많이 호출되는 클래스&lt;/b&gt;는 사용자의 코드와 환경에 따라 다를 수 있지만, 일반적으로 &lt;b&gt;핵심 Java API 클래스&lt;/b&gt;들이 가장 많이 호출됨. 그중에서도 아래 클래스들이 자주 호출됨:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. java.lang 패키지&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 패키지의 클래스는 기본적으로 &lt;b&gt;import 없이 사용&lt;/b&gt;되므로 매우 자주 호출됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;String&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;문자열 처리와 관련된 작업에 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;예: &lt;/span&gt;System.out.println(&quot;Hello&quot;);&lt;span&gt;에서 문자열 리터럴 &lt;/span&gt;&quot;Hello&quot;&lt;span&gt;가 포함됨.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Object&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;모든 클래스의 최상위 부모 클래스.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;객체 생성, 비교, 해시코드 계산 등에서 자주 호출됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;예: &lt;/span&gt;equals&lt;span&gt;, &lt;/span&gt;hashCode&lt;span&gt;, &lt;/span&gt;toString&lt;span&gt; 메서드.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Math&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;수학적 계산(예: &lt;span&gt;Math.sqrt&lt;/span&gt;, &lt;span&gt;Math.pow&lt;/span&gt;)에 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. java.util 패키지&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컬렉션 및 유틸리티 클래스가 포함된 자바의 필수 패키지.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;ArrayList&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;리스트를 동적으로 관리하는 데 가장 많이 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;예: &lt;/span&gt;List&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;HashMap&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;키-값 쌍을 저장하고 검색할 때 자주 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;예: &lt;/span&gt;Map&amp;lt;String, Integer&amp;gt; map = new HashMap&amp;lt;&amp;gt;();&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Collections&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;컬렉션 조작을 위한 유틸리티 메서드 제공.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;예: &lt;/span&gt;Collections.sort(list)&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. java.io 패키지&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입출력 작업과 관련된 클래스.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;BufferedReader&lt;/b&gt; / &lt;b&gt;BufferedWriter&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;파일이나 콘솔 입력을 처리할 때 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;File&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;파일 경로와 관련된 작업에서 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;예: &lt;/span&gt;new File(&quot;path/to/file&quot;)&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. java.nio 패키지&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보다 효율적인 I/O 작업을 위해 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Path&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;파일 시스템 경로를 나타내는 데 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Files&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;파일 복사, 이동, 삭제 등의 작업에서 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. java.time 패키지&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;날짜와 시간 처리.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;LocalDate&lt;/b&gt;, &lt;b&gt;LocalDateTime&lt;/b&gt;, &lt;b&gt;Instant&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;최신 날짜/시간 API로 매우 자주 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;예: &lt;/span&gt;LocalDate.now()&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. System 클래스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;System.out&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;콘솔 출력에서 가장 많이 호출.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;예: &lt;/span&gt;System.out.println(&quot;Hello World&quot;);&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;System.currentTimeMillis()&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;현재 시간을 밀리초 단위로 가져오는 데 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결론: 가장 자주 호출되는 클래스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;b&gt;java.lang.String&lt;/b&gt;: 문자열 작업에서 필수.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;b&gt;java.util.ArrayList&lt;/b&gt;: 컬렉션 관리.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;3.&lt;span&gt; &lt;/span&gt;&lt;b&gt;java.lang.Object&lt;/b&gt;: 모든 클래스의 최상위 부모.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;4.&lt;span&gt; &lt;/span&gt;&lt;b&gt;java.lang.System&lt;/b&gt;: 출력과 시간 측정.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;5.&lt;span&gt; &lt;/span&gt;&lt;b&gt;java.util.HashMap&lt;/b&gt;: 키-값 저장.&lt;/p&gt;</description>
      <category>Programming/자바(Java)</category>
      <author>먹보 개발자</author>
      <guid isPermaLink="true">https://5ddugi.tistory.com/152</guid>
      <comments>https://5ddugi.tistory.com/152#entry152comment</comments>
      <pubDate>Fri, 10 Jan 2025 19:12:23 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 중간회고(240928~250110)</title>
      <link>https://5ddugi.tistory.com/151</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;먹보블로그에서의 첫 회고&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 나는 왜 회고를 해야할까&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 집중적으로 공부했던것&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 학습기간 중 개선했던 한 가지&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 복기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 고민되는 것&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;나는 왜 회고를 해야할까?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 기억과 기록 중 오래가는것은 기록이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 내가 했던  공부와 작업물들을 점검한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 협업시 기술이나 소통에 있어 나의 미흡했던 부분을 복기하고 개선한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;집중적으로 공부했던 것&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Java&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; a. 세븐포커 카드게임 미션을 통한 객체지향적 프로그래밍 사고 및 구현&lt;br /&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 전략 패턴(Strategy Pattern): 상황에 맞는 카드 족보 검사를 수행하도록 다양한 전략 구현 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 유지보수성 강화 불변성(Immutable Object): Card 클래스에 불변 객체 설계 적용&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Spring(프로젝트)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; a. 쇼핑몰 프로젝트를 통한 사용자 입장에서의 백엔드 역할 고찰&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Docker&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; a. 도커의 원리와 가상화 기술에 대한 이해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;학습 중 개선 했던 한 가지&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 필기 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; a. 핵심 내용을 번호나 점 형태로 나열해 한눈에 보기 쉽게 정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;복기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 소통&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; a. 같은 내용도 표현에따라 전달력이 높을 수도 낮을 수도 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; b. 나에게 당연한것이 누군가에겐 생소한것일 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 집중도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; a. 프로젝트가 끝난 후 2주정도의 시간을 되돌아보면 공부할 때 집중도가 많이 떨어진 모습이 보인다. 집중을 하기위한 노력과 연구가 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 건강&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; a. 운동부족&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; b. 식습관이 악화됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; c. 수면패턴 꼬임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;고민되는 것&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;겉핥기 공부를 하고있다 생각된다. 집중도 있게 공부를 하는것과 별개로 내가 소프트웨어 지식을 보고 탐구하는 시각의 두께가 꽤나 얇은것같다. 간단한 예로 변수는 간단히 '변경이 가능한 공간'이라고 생각하고 있었다. 하지만 변수는 정확히 말하면 메모리의 특정 주소를 가리키는 식별자라는것을 최근에 깨닫게 되었다. 실패라는 개념은 쉽게 적용되지 않는것같다. 일단 부딪혀보되 대상의 본질과 역할을 파악하려 노력하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>회고</category>
      <author>먹보 개발자</author>
      <guid isPermaLink="true">https://5ddugi.tistory.com/151</guid>
      <comments>https://5ddugi.tistory.com/151#entry151comment</comments>
      <pubDate>Fri, 10 Jan 2025 12:37:38 +0900</pubDate>
    </item>
    <item>
      <title>Vector Database</title>
      <link>https://5ddugi.tistory.com/150</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;답변을 생성할 때 필요한 데이터는 사용자가 원하는 정보이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자의 질문과 관련있는 데이터여야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;관련이 있다는것을 어떻게 판단할까?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관련성 파악을 위해 vector를 활용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 단어 또는 문장의 유사도를 파악해서 관련성을 측정한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;벡터를 어떻게 생성하는가?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedding 모델을 활용해서 vector를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임베딩 모델은 문장에서 비슷한 단어가 자주 붙어있는 것을 학습한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 왕은 왕자의 아버지다 / 여왕은 왕자의 어머니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; &quot;왕자의&quot; 라는 단어 앞에 등장하는 &quot;왕&quot;과 &quot;여왕&quot;은 유사할 가능성이 높다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;벡터 데이터베이스란&lt;/b&gt;&lt;br /&gt;1. Embedding 모델을 활용해 생성된 vector를 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 단순히 vector만 저장하면 안되고 metadata도 같이 저장해야한다 **이 부분이 상당히 중요하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 문서의 이름, 페이지 번호 등 같이 저장 -&amp;gt; LLM이 생성하는 답변의 퀄리티가 상승함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Vector를 대상으로 유사도 검색 실시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자의 질문과 가장 비슷한 문서를 가져오는 것 - Retrieval&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 가져온 문서를 prompt를 통해 LLM에 제공 - Augmented&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LLM은 prompt를 활용해서 답변 생성&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=========+&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;벡터란?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벡터는 숫자 배열로, 공간에서 크기와 방향을 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;벡터 데이터란?&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숫자의 배열로 이루어진 데이터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;텍스트: &amp;ldquo;apple&amp;rdquo; &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;[0.5, 0.1, 0.8]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;이미지: 고유한 패턴을 나타내는 벡터&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;[0.2, 0.7, 0.9, ...]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;음성: 주파수 특성을 반영한 벡터&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;[0.3, 0.6, 0.4, ...]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;벡터 데이터가 중요한 이유&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;컴퓨터는 숫자로 된 데이터를 처리하기 때문에, 비정형 데이터를 벡터로 변환해야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;고차원 벡터 공간에서 데이터를 비교, 분류, 예측 가능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI/RAG기반 LLM활용 AI 모델 개발</category>
      <author>먹보 개발자</author>
      <guid isPermaLink="true">https://5ddugi.tistory.com/150</guid>
      <comments>https://5ddugi.tistory.com/150#entry150comment</comments>
      <pubDate>Wed, 8 Jan 2025 17:38:25 +0900</pubDate>
    </item>
    <item>
      <title>RAG란?</title>
      <link>https://5ddugi.tistory.com/149</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. Retrieval&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터를 가져오는것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Augmented&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Retrieval된 데이터를 LLM에 전달하며 마치 정보를 아는것처럼&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Generation&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 답변을 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;고민할 부분&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 답변 생성은 LLM 역할&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 나는 데이터를 잘 가져와서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. LLM에 잘 전달해야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터를 잘 가져오려면&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 잘 저장해야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 잘 저장하는게 어려움 - 제일 중요한 부분임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;잘 전달하려면?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 프롬프트를 잘 활용해야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 문맥을 어떻게 제공할 것인가 ***&lt;/p&gt;</description>
      <category>AI/RAG기반 LLM활용 AI 모델 개발</category>
      <author>먹보 개발자</author>
      <guid isPermaLink="true">https://5ddugi.tistory.com/149</guid>
      <comments>https://5ddugi.tistory.com/149#entry149comment</comments>
      <pubDate>Wed, 8 Jan 2025 17:25:55 +0900</pubDate>
    </item>
  </channel>
</rss>