<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>I can do it(Feat. DEV)</title>
    <link>https://precious-value.tistory.com/</link>
    <description>긍정왕 4년차 개발자(풀스택 웹개발 3년/장고 백엔드 1년)</description>
    <language>ko</language>
    <pubDate>Fri, 31 Jul 2026 11:32:59 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>까짓거 해보자 개발자</managingEditor>
    <image>
      <title>I can do it(Feat. DEV)</title>
      <url>https://tistory1.daumcdn.net/tistory/5663919/attach/8032b3ecffb340b4afa07b3634989484</url>
      <link>https://precious-value.tistory.com</link>
    </image>
    <item>
      <title>[Git] Alias 설정 가이드</title>
      <link>https://precious-value.tistory.com/67</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 설정 파일 위치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Windows 기준:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;~/.gitconfig 또는 C:\Users\{사용자명}\.gitconfig&lt;/li&gt;
&lt;li&gt;WSL 사용 시: ~/.gitconfig (리눅스 홈 디렉토리)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;위치 확인:&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;bash&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;color: #abb2bf; text-align: left;&quot;&gt;&lt;code&gt;git config --list --show-origin --global&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Alias 등록 방법&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;방법 1: 파일 직접 편집&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;bash&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;jboss-cli&quot; style=&quot;color: #abb2bf; text-align: left;&quot;&gt;&lt;code&gt;# 파일 열기
vim ~/.gitconfig
# 또는
code ~/.gitconfig&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;ini&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;vim&quot; style=&quot;color: #abb2bf; text-align: left;&quot;&gt;&lt;code&gt;[alias]
    co = checkout
    br = branch
    st = status
    ci = commit
    lg = log --oneline --graph --all --decorate&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;방법 2: 명령어로 등록&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;bash&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;color: #abb2bf; text-align: left;&quot;&gt;&lt;code&gt;git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 별도 파일로 분리 관리 (선택사항)&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;bash&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;crystal&quot; style=&quot;color: #abb2bf; text-align: left;&quot;&gt;&lt;code&gt;# ~/.gitconfig
[include]
    path = ~/.config/git/aliases.gitconfig

# ~/.config/git/aliases.gitconfig
[alias]
    co = checkout
    st = status&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 적용 및 확인&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;적용:&lt;/b&gt; 저장 즉시 자동 적용 (source 불필요)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;확인:&lt;/b&gt; git config --get-regexp alias&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용:&lt;/b&gt; git st, git co main 등&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>git alias 설정</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/67</guid>
      <comments>https://precious-value.tistory.com/67#entry67comment</comments>
      <pubDate>Fri, 21 Nov 2025 17:49:24 +0900</pubDate>
    </item>
    <item>
      <title>[운동 데이터 최적화 삽질기 구조적 문제를 모르고 자질구레한 해결책만 찾았던 이야기</title>
      <link>https://precious-value.tistory.com/66</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;개발자로 일하다 보면 종종 &quot;아, 내가 이걸 완전히 잘못 이해하고 있었구나&quot;라는 순간을 마주합니다. 저는 최근 운동 데이터 시각화 작업을 하면서 바로 그런 깨달음을 얻었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇 달간 Django 쿼리셋 최적화, 인덱스 튜닝, 캐싱 등으로 성능을 개선하려고 씨름했지만 근본적인 한계에 부딪혔고, 뒤늦게 문제의 본질을 깨달았습니다. &lt;b&gt;애초에 데이터의 성격을 잘못 이해하고 있었던 것&lt;/b&gt;이었죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 이 실패담을 통해 OLAP와 OLTP의 차이, 그리고 올바른 문제 진단의 중요성에 대해 이야기해보겠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;시작: 누군가 설계한 시스템을 이어받다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 맡은 프로젝트는 사용자들의 운동 데이터를 수집하고 시각화하는 플랫폼이었습니다. 이전 개발자가 구축해놓은 시스템은 전형적인 Django + PostgreSQL 구조였습니다.&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; style=&quot;color: #abb2bf; text-align: left;&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 기존에 설계된 모델들 - 예시

class WorkoutData(models.Model):
    timestamp = models.DateTimeField()
    heart_rate = models.IntegerField(null=True)
    speed = models.FloatField(null=True)  # km/h
    distance = models.FloatField(null=True)  # km
    elevation = models.FloatField(null=True)  # m
    ...

class WeightTraining(models.Model):
    exercise_name = models.CharField(max_length=100)
    sets = models.IntegerField()
    reps = models.IntegerField()
    weight = models.FloatField()  # kg
    ...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언뜻 보면 일반적인 Django 모델 같았고, 저는 &quot;운동 데이터가 RDB에 저장되고 있으니까 이걸 사용하면 되겠지&quot;라고 생각했습니다. 그저 기존 코드를 이어받아 시각화(그래프) 기능을 추가하는 작업이라고 생각했죠.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 발견: 시각화 쿼리가 너무 느리다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 사용자 대시보드를 만들면서 본격적으로 드러났습니다. 기획에서 생각한 운동 통계에 대해서 보고 싶어하는 요구사항들:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일별/월별 운동량 변화 추이(최대힘, 평균힘 등) - 그래프&lt;/li&gt;
&lt;li&gt;운동 모드별 운동 데이터 통계&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 시각화를 위해 쿼리를 작성하는데... 생각보다 너무 복잡하고 느렸습니다.(운동 데이터 테이블에서 필요한 필드가 json 필드안에 있어 아래 코드와 유사하게 annotate로 커스텀 필드를 만들어 쿼리셋을 조회했어요)&lt;/p&gt;
&lt;pre id=&quot;code_1758250174807&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 예시 코드
class WorkoutAnalyticsService:
    def get_monthly_workout_stats(self, user_id: int, year: int) -&amp;gt; Dict:
        &quot;&quot;&quot;
        월별 운동 통계 - 이 쿼리가 5초 넘게 걸렸다
        &quot;&quot;&quot;
        sessions = WorkoutSession.objects.filter(
            user_id=user_id,
            start_time__year=year
        ).annotate(
            month=Extract('start_time', 'month'),
            duration=F('end_time') - F('start_time'),
            avg_heart_rate=Avg('workoutdata__heart_rate'),
            max_speed=Max('workoutdata__speed'),
            total_distance=Sum('workoutdata__distance')
        ).values('month').annotate(
            session_count=Count('id'),
            total_calories=Sum('calories_burned'),
            avg_duration=Avg('duration'),
            workout_types=ArrayAgg('workout_type', distinct=True)
        ).order_by('month')
        
        return list(sessions)&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;한달 치 운동 데이터만 조회하는데 10초가 넘게 걸리는 상황. 이건 분명히 문제가 있다고 생각했습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;첫 번째 시도: Django 최적화의 모든 것을 동원하다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당연히 제 첫 반응은 &quot;쿼리 최적화 문제겠지&quot;였습니다. Django 성능 최적화에 대한 모든 기법을 총동원했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. 디버깅을 통해 근본적인 병목 지점을 찾아 다른 방법으로 리팩토링(이라 쓰고 노가다라고 읽는다..)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뜯어서 말하자면 각 API마다 요청이 느렸던 이유가 상이했습니다. json 필드에서 필요한 필드를 annotate로 새로운 필드로 만들어서 쿼리 시간이 오래걸린다던지, 특정 로직에서 대량의 데이터를 리스트로 변환하는 과정에서 메모리에 적재하는 시간이 오래걸린다던지.. 등 gpt와 끊임 없이 이야기하며 왠만한 최적화를 다 해보았습니다. 결과적으로는 1~2초대로 빨라진 API들도 있었지만 쿼리 요청이 복잡한 API는 여전히 5~10초는 걸렸습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. select_related와 prefetch_related 활용&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; style=&quot;color: #abb2bf; text-align: left;&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 예시
# N+1 쿼리 문제 해결 시도
def get_optimized_workout_sessions(self, user_id: int):
    return WorkoutSession.objects.filter(
        user_id=user_id
    ).select_related('user').prefetch_related(
        'workoutdata_set',
        'weighttraining_set'
    )&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 데이터베이스 인덱스 추가&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; style=&quot;color: #abb2bf; text-align: left;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;-- 추가한 인덱스들
CREATE INDEX idx_workout_session_user_time ON workout_session(user_id, start_time);
CREATE INDEX idx_workout_data_session_timestamp ON workout_data(session_id, timestamp);
CREATE INDEX idx_workout_data_heart_rate ON workout_data(heart_rate) WHERE heart_rate IS NOT NULL;
CREATE INDEX idx_workout_session_type_time ON workout_session(workout_type, start_time);&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;sql 쿼리문으로 인덱스를 추가하지 않고 장고 모델에 설정을 해서 json필드에 인덱스를 설정을 해서 테스트를 했지만...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 풀 스캔이랑 크게 다르지 않은 성능으로 테스트는 실패했죠 ㅠ&lt;/p&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 집계 테이블까지 도입&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;을 하려고 했으나 일단 시간에 떠밀려 보류했습니다.&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; style=&quot;color: #abb2bf; text-align: left;&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 예시
# 사전 집계된 데이터를 저장하는 테이블
class DailyWorkoutSummary(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    date = models.DateField()
    total_sessions = models.IntegerField(default=0)
    total_calories = models.IntegerField(default=0)
    total_duration = models.DurationField(default=timedelta(0))
    avg_heart_rate = models.FloatField(null=True)
    workout_types = models.JSONField(default=list)
    
    class Meta:
        unique_together = ['user', 'date']&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결과: 개선은 되었지만 근본적 한계는 여전했다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 최적화들로 성능은 어느 정도 개선되었습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;5~10초 &amp;rarr; 2~3초 또는 10초 이상 &amp;rarr; 5 ~ 10초 정도로 단축&lt;/li&gt;
&lt;/ul&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;1. 여전히 느린 실시간 조회&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; style=&quot;color: #abb2bf; text-align: left;&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 예시
# 여전히 느린 쿼리들
def get_workout_intensity_analysis(self, user_id: int):
    &quot;&quot;&quot;
    운동 강도별 분석
    &quot;&quot;&quot;
    return WorkoutData.objects.filter(
        session__user_id=user_id
    ).annotate(
        intensity=Case(
            When(heart_rate__lt=120, then=Value('Low')),
            When(heart_rate__lt=150, then=Value('Moderate')),
            When(heart_rate__lt=180, then=Value('High')),
            default=Value('Very High')
        )
    ).values('intensity', 'session__workout_type').annotate(
        total_time=Sum('session__end_time') - Sum('session__start_time'),
        avg_heart_rate=Avg('heart_rate')
    )&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 복잡한 json 구조에서 조회 속도 느림&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;json 필드 안에 필드를 불러오는 속도가 느림&lt;/li&gt;
&lt;li&gt;비정규화된 구조로 인한 복잡성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 확장성 문제&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 수가 늘어날수록 선형적으로 증가하는 쿼리 시간&lt;/li&gt;
&lt;li&gt;데이터가 쌓일수록 더욱 느려지는 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;깨달음의 순간: &quot;운동 데이터는 애초에 OLAP 데이터였다&quot;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇 주간의 최적화 삽질을 하고 있는 와중에 새로운 백엔드 리더가 알려준 정보..OLAP&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;잠깐.. 운동 데이터의 특성을 다시 한번 생각해보자.&quot;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;운동 데이터의 실제 사용 패턴 분석&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;어떻게 데이터가 생성되는가?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 운동을 완료하면 세트 당 운동 데이터가 생성됨&lt;/li&gt;
&lt;li&gt;운동 중에는 측정된 시계열로 속도, 위치, 힘 등의 데이터가 쌓임&lt;/li&gt;
&lt;li&gt;한 번 저장된 운동 데이터는 거의 수정되지 않음 (READ-heavy)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;어떻게 데이터가 조회되는가?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개별 운동 기록보다는 &lt;b&gt;통계와 추세&lt;/b&gt;에 관심&lt;/li&gt;
&lt;li&gt;&quot;지난 달 총 몇 번 운동했지?&quot;, &quot;이번 주 평균 심박수는?&quot;&lt;/li&gt;
&lt;li&gt;복잡한 집계와 그룹핑이 주요 사용 패턴&lt;/li&gt;
&lt;li&gt;실시간성보다는 &lt;b&gt;분석 결과의 정확성&lt;/b&gt;이 중요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터의 성격 자체가...&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시계열 데이터 (Time-series data)&lt;/li&gt;
&lt;li&gt;분석 중심 (Analytics-focused)&lt;/li&gt;
&lt;li&gt;읽기 중심 (Read-heavy)&lt;/li&gt;
&lt;li&gt;복잡한 집계 쿼리가 주요 워크로드&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 깨달았습니다. &lt;b&gt;&quot;이거 완전히 OLAP 성격의 데이터잖아?&quot;&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;OLAP vs OLTP: 이론적 배경을 뒤늦게 이해하다&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;OLTP (Online Transaction Processing)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;목적&lt;/b&gt;: 실시간 거래 처리 (주문, 결제, 예약 등)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&gt;: 짧고 빠른 트랜잭션, 높은 동시성, ACID 보장&lt;/li&gt;
&lt;li&gt;&lt;b&gt;쿼리&lt;/b&gt;: 단순한 CRUD 작업&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 구조&lt;/b&gt;: 정규화된 관계형 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; style=&quot;color: #abb2bf; text-align: left;&quot;&gt;&lt;code&gt;# OLTP 예시: 전형적인 거래 처리
@transaction.atomic
def create_order(user_id: int, items: List[Dict]) -&amp;gt; Order:
    &quot;&quot;&quot;빠르고 정확한 주문 처리가 핵심&quot;&quot;&quot;
    order = Order.objects.create(user_id=user_id)
    for item in items:
        OrderItem.objects.create(
            order=order,
            product_id=item['product_id'],
            quantity=item['quantity']
        )
    return order&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;OLAP (Online Analytical Processing)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;목적&lt;/b&gt;: 데이터 분석과 의사결정 지원&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&gt;: 복잡한 분석 쿼리, 대용량 데이터 처리, 읽기 중심&lt;/li&gt;
&lt;li&gt;&lt;b&gt;쿼리&lt;/b&gt;: 복잡한 집계, 조인, 그룹핑&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 구조&lt;/b&gt;: 비정규화된 차원 모델링 (스타 스키마 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; style=&quot;color: #abb2bf; text-align: left;&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# OLAP 예시: 복잡한 분석 쿼리
def get_sales_analysis(year: int):
    &quot;&quot;&quot;복잡한 집계와 분석이 핵심&quot;&quot;&quot;
    return SalesFact.objects.filter(
        date__year=year
    ).values('product_category', 'region').annotate(
        total_revenue=Sum('sales_amount'),
        avg_order_value=Avg('sales_amount'),
        customer_count=Count('customer_id', distinct=True),
        growth_rate=Window(
            expression=Lag('total_revenue', offset=1),
            partition_by=['product_category'],
            order_by=['date']
        )
    )&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 진단: 왜 이걸 몰랐을까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뒤돌아보니 명확한 신호들이 있었습니다:&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 쿼리 패턴이 완전히 OLAP적이었음&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;color: #abb2bf; text-align: left;&quot;&gt;&lt;code&gt;# 내가 작성한 쿼리들을 다시 보니...
# - 복잡한 집계 함수 (SUM, AVG, COUNT)
# - 다중 테이블 조인
# - GROUP BY와 복잡한 조건문
# - 시계열 분석

# 이건 완전히 OLAP 쿼리 패턴이었다!
WorkoutData.objects.filter(
    session__user_id=user_id
).aggregate(
    zone_1=Count('id', filter=Q(heart_rate__lt=120)),
    zone_2=Count('id', filter=Q(heart_rate__range=(120, 150))),
    avg_heart_rate=Avg('heart_rate')
)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 데이터 사용 패턴이 완전히 분석 중심이었음&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자들은 &quot;오늘 운동&quot; 보다는 &quot;이번 달 운동 통계&quot;에 관심&lt;/li&gt;
&lt;li&gt;실시간 업데이트보다는 정확한 분석이 중요&lt;/li&gt;
&lt;li&gt;개별 레코드보다는 집계된 인사이트가 가치&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 성능 병목이 전형적인 OLAP 문제였음&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;복잡한 조인으로 인한 성능 저하&lt;/li&gt;
&lt;li&gt;대용량 데이터 스캔&lt;/li&gt;
&lt;li&gt;집계 연산의 오버헤드&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;깨달음: 근본적인 아키텍처 미스매치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 제가 몇 달간 씨름한 문제는 **&quot;OLAP 성격의 데이터를 OLTP 구조에 우겨넣고 있었던 것&quot;**이었습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;gcode&quot; style=&quot;color: #abb2bf; text-align: left;&quot;&gt;&lt;code&gt;운동 데이터의 본질: OLAP (분석 중심)
기존 시스템 구조: OLTP (거래 처리 중심)
                 &amp;darr;
         구조적 미스매치!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무리 Django 쿼리를 최적화하고, 인덱스를 추가하고, 캐싱을 도입해도 근본적인 한계가 있을 수밖에 없었던 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마치 &lt;b&gt;망치로 나사를 조이려고 하면서 &quot;왜 나사가 안 조여지지?&quot;라고 고민했던 격&lt;/b&gt;이었죠.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;삽질에서 얻은 교훈들&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 문제의 본질부터 파악하자&lt;/h3&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; &quot;쿼리가 느리네? 인덱스 추가하고 캐싱하자!&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;올바른 접근:&lt;/b&gt; &quot;이 데이터는 어떤 성격이고, 어떻게 사용되며, 어떤 아키텍처가 적합할까?&quot;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 기존 코드를 맹신하지 말자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 개발자가 관계형 DB를 선택했다고 해서 그것이 반드시 최선의 선택은 아닙니다. 항상 의문을 가지고 검토해야 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 최적화 vs 리아키텍처의 구분&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순한 성능 최적화로 해결할 수 있는 문제와 아키텍처 자체를 바꿔야 하는 문제를 구분할 수 있어야 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 이론과 실무의 균형&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OLAP/OLTP 같은 이론적 개념들이 실제로 왜 중요한지 체감할 수 있었습니다. 이론을 무시하고 경험만으로는 한계가 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리: 올바른 진단의 중요성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇 달간의 삽질은 결코 무의미하지 않았습니다. Django 성능 최적화 기법들을 깊이 학습할 수 있었고, 무엇보다 &lt;b&gt;문제 진단의 중요성&lt;/b&gt;을 뼈저리게 깨달았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자로서 기술적 해결책에만 매몰되지 않고, 항상 한 발짝 뒤로 물러나서 문제의 본질을 파악하는 습관을 길러야겠다고 다짐했습니다.&lt;/p&gt;</description>
      <category>개발자 모드/경험</category>
      <category>OLAP</category>
      <category>OLTP</category>
      <category>이론의중요성</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/66</guid>
      <comments>https://precious-value.tistory.com/66#entry66comment</comments>
      <pubDate>Fri, 19 Sep 2025 12:15:12 +0900</pubDate>
    </item>
    <item>
      <title>[Log] 개발자 감성 저격  터미널 로그에 색 입히는 법(feat. Python)</title>
      <link>https://precious-value.tistory.com/65</link>
      <description>&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;터미널 로그도 이제 시각적으로 구분해서 디버깅하자! Python으로 로그를 색상별로 출력하는 방법을 알려드립니다.&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;텍스트 로그의 한계와 색상 적용 필요성&lt;/li&gt;
&lt;li&gt;ANSI 코드로 직접 색상 입히기&lt;/li&gt;
&lt;li&gt;rich 라이브러리로 쉽게 색상 출력하기&lt;/li&gt;
&lt;li&gt;print 함수 오버라이딩으로 전역 적용하기&lt;/li&gt;
&lt;li&gt;타입별 색상 분리 출력 함수 만들기&lt;/li&gt;
&lt;li&gt;실무에서 활용하는 컬러 로그 전략&lt;/li&gt;
&lt;li&gt;컬러 로그를 위한 마무리 제안&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;텍스트 로그의 한계와 색상 적용 필요성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디버깅을 하다 보면 쏟아지는 로그 속에서 중요한 메시지를 놓치기 일쑤입니다.   특히 콘솔에 찍히는 &lt;code&gt;print()&lt;/code&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;&quot;중요한 로그는 색으로 구분되면 얼마나 좋을까?&quot;&lt;/b&gt; 이런 배경에서 어떤 방법이 있는지 찾아보았고, ANSI 코드와 로그 스타일링 도구 등 여러 방법이 있다는 것을 알게 되었습니다. 저는 바로 직관적으로 사용할 수 있는&amp;nbsp; ANSI 코드로 설정을 해보았어요!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ANSI 코드로 직접 색상 입히기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 기본적이면서도 즉시 효과를 볼 수 있는 방법입니다.&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;print(&quot;\033[92m[SUCCESS] 작업이 완료되었습니다.\033[0m&quot;)
print(&quot;\033[91m[ERROR] 문제가 발생했습니다.\033[0m&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;색상 코드 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;  &lt;code&gt;\033[91m&lt;/code&gt;: 빨간색&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;\033[92m&lt;/code&gt;: 초록색&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;\033[93m&lt;/code&gt;: 노란색&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;\033[94m&lt;/code&gt;: 파란색&lt;/li&gt;
&lt;li&gt;⚪ &lt;code&gt;\033[0m&lt;/code&gt;: 색상 초기화&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;rich 라이브러리로 쉽게 색상 출력하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;rich&lt;/code&gt;를 쓰면 훨씬 간단하게 컬러 로그를 출력할 수 있어요.&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;pip install rich&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;from rich import print

print(&quot;[bold green]✔ 작업 완료[/]&quot;)
print(&quot;[bold red]✖ 오류 발생[/]&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;print 함수 오버라이딩으로 전역 적용하기&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# custom_print.py
def print_colored(*args, **kwargs):
    print(&quot;\033[96m&quot;, end=&quot;&quot;)  # 청록
    print(*args, **kwargs)
    print(&quot;\033[0m&quot;, end=&quot;&quot;)   # 리셋

from custom_print import print_colored as print
print(&quot;이건 자동으로 색상이 적용됩니다!&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 전체 로그를 하나의 색으로 지정해서 변경했었는데, 뭔가 message와 value를 다른 값으로 찍으면 더 좋을 것 같아서 수정했어요!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;타입별 색상 분리 출력 함수 만들기&lt;/h2&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;def custom_log(message: str, value = None, level: str = &quot;debug&quot;) -&amp;gt; None:
    &quot;&quot;&quot;
    print 함수에 색상을 추가하는 함수
    &quot;&quot;&quot;
    COLORS = {
        &quot;debug&quot;: &quot;\033[95m&quot;,     # 밝은 보라
        &quot;info&quot;: &quot;\033[34m&quot;,      # 파랑? 보라
        &quot;success&quot;: &quot;\033[92m&quot;,   # 밝은 초록
        &quot;warning&quot;: &quot;\033[93m&quot;,   # 밝은 노랑
        &quot;error&quot;: &quot;\033[91m&quot;,     # 밝은 빨강
        &quot;value&quot;: &quot;\033[96m&quot;,     # 청록 (value용 고정)
        &quot;default&quot;: &quot;\033[0m&quot;,    # 초기화 (기본)
    }

    level_color = COLORS.get(level.lower(), COLORS[&quot;default&quot;])
    value_color = COLORS[&quot;value&quot;]    
    print(f&quot;{level_color}[{level.upper()}] {message}&quot;, f&quot;{value_color}{value}&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;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실무에서 활용하는 컬러 로그 전략&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;✅ 성공: 초록&lt;/li&gt;
&lt;li&gt;⚠ 경고: 노랑&lt;/li&gt;
&lt;li&gt;❌ 에러: 빨강&lt;/li&gt;
&lt;li&gt;ℹ 정보: 파랑&lt;/li&gt;
&lt;li&gt;  디버그: 보라&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시 몰라 알아보았지만! 정하기 나름이겠죠?!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;컬러 로그를 위한 마무리 제안&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단순한 디버깅은 ANSI 코드로 충분&lt;/li&gt;
&lt;li&gt;시스템 로그는 헬퍼 함수로 정리&lt;/li&gt;
&lt;li&gt;시각적으로 깔끔한 출력은 &lt;code&gt;rich&lt;/code&gt; 추천&lt;/li&gt;
&lt;li&gt;팀 프로젝트라면 컬러 기준을 문서화&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;faq&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문들 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q1. ANSI 코드는 윈도우에서도 잘 작동하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A1. 최신 Windows Terminal에서는 잘 작동합니다. 구형 CMD에서는 &lt;code&gt;colorama&lt;/code&gt; 모듈을 설치해보세요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q2. 로그 색상을 레벨에 따라 자동 적용할 수 있나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A2. 네! 위의 &lt;code&gt;log()&lt;/code&gt; 함수를 사용하면 자동 적용됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q3. 팀 프로젝트에서도 사용해도 괜찮을까요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A3. 물론입니다! 메시지 분류가 쉬워지고 협업에도 좋아요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q4. JSON도 색상 출력 가능한가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A4. 가능합니다. &lt;code&gt;from rich import print_json&lt;/code&gt;을 사용해 보세요.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;여러분은 어떻게 로그를 출력하고 계신가요?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;print()&lt;/code&gt;에 색상 코드 써보신 적 있나요? 혹시 아직도 흑백 로그만 사용하고 계신가요? 댓글로 여러분의 로그 출력 방식이나 꿀팁을 공유해 보세요  &lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  에필로그&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전엔 저도 단순히 &lt;code&gt;print(&quot;에러 발생&quot;)&lt;/code&gt;만 찍었었는데, 지금은 칙칙한 터미널에 알록달록 로그를 단번에 확인할 수 있네요! 다음엔 &lt;b&gt;Python rich로 로그 테이블 출력하기&lt;/b&gt;도 사용해 보고 소개해드릴게요!&lt;/p&gt;</description>
      <category>개발자 모드/응용</category>
      <category>python로그</category>
      <category>디버깅팁</category>
      <category>로그컬러설정</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/65</guid>
      <comments>https://precious-value.tistory.com/65#entry65comment</comments>
      <pubDate>Tue, 1 Apr 2025 16:46:16 +0900</pubDate>
    </item>
    <item>
      <title>[Cursor]MIT 개발자들이 만든 AI IDE, Cursor란? 사용법부터 꿀팁까지 총정리!</title>
      <link>https://precious-value.tistory.com/64</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt; &amp;zwj;  커서는 어디서 시작됐을까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2022년, MIT 출신 개발자 네 명이 모였어요.&lt;br /&gt;Sualeh, Arvid, Aman, Michael.&lt;br /&gt;이들이 만든 회사가 바로 &lt;b&gt;Anysphere Inc&lt;/b&gt;예요.&lt;br /&gt;&lt;br /&gt;그들이 고민한 건 단 하나,&lt;br /&gt;&lt;b&gt;&amp;ldquo;왜 개발은 아직도 이렇게 비효율적이지?&amp;rdquo;&lt;/b&gt;&lt;br /&gt;그 고민 끝에 나온 해답이 바로 &lt;b&gt;Cursor&lt;/b&gt;였죠.&lt;br /&gt;&lt;br /&gt;기존 VS Code의 좋은 점은 그대로 살리면서,&lt;br /&gt;AI 기능만 똑똑하게 &amp;lsquo;쏙쏙&amp;rsquo; 넣은 개발 도구!&lt;br /&gt;그게 바로 Cursor의 정체예요  &lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  공식 출시는 2023년, 그 뒤는 쭉 상승곡선&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;2023년&lt;/b&gt;: OpenAI가 800만 달러 투자&lt;br /&gt;- &lt;b&gt;2024년&lt;/b&gt;: Andreessen Horowitz가 6,000만 달러 투자&lt;br /&gt;- &lt;b&gt;2025년&lt;/b&gt;: 기업가치 &lt;b&gt;25억 달러 돌파!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;2024년에는 Supermaven이라는&lt;br /&gt;AI 코드 어시스턴트도 인수해서&lt;br /&gt;기능이 더 강력해졌답니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  Cursor, 이렇게 쓰면 돼요!&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;✅ 설치 방법&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cursor.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;공식 사이트&lt;/a&gt; 접속&lt;/li&gt;
&lt;li&gt;운영체제에 맞는 설치 파일 다운로드 (macOS / Windows / Linux)&lt;/li&gt;
&lt;li&gt;GitHub 계정으로 로그인&lt;/li&gt;
&lt;li&gt;기존 VS Code 설정과 확장 자동 불러오기&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;✅ 기본 기능&lt;/h4&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;5&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;  AI Ask&lt;/td&gt;
&lt;td&gt;코드에 질문하거나 수정 요청&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;  자동완성&lt;/td&gt;
&lt;td&gt;다음 줄 예측 후 자동 추천&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✍️ 리팩토링&lt;/td&gt;
&lt;td&gt;함수 분리, 중복 제거 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;  코드베이스 탐색&lt;/td&gt;
&lt;td&gt;자연어로 코드 찾기 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;  테스트 생성&lt;/td&gt;
&lt;td&gt;테스트 코드 자동 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;  .cursorrules&lt;/td&gt;
&lt;td&gt;AI에게 행동 가이드 주기&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;✅ 단축키 (윈도우 기준)&lt;/h4&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;5&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;단축키&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Ask&lt;/td&gt;
&lt;td&gt;Ctrl + K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;자동완성 수락&lt;/td&gt;
&lt;td&gt;Tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;줄 이동&lt;/td&gt;
&lt;td&gt;Alt + &amp;uarr; / &amp;darr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;여러 줄 선택&lt;/td&gt;
&lt;td&gt;Ctrl + Alt + &amp;uarr; / &amp;darr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;코드 접기/펼치기&lt;/td&gt;
&lt;td&gt;Ctrl + Shift + [ / ]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;터미널 열기&lt;/td&gt;
&lt;td&gt;Ctrl + `&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;빠른 탐색 (Go to)&lt;/td&gt;
&lt;td&gt;Ctrl + P&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  꿀팁 1 : .cursorrules, 이거 안 쓰면 손해예요!&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;.cursorrules&lt;/b&gt;는 Cursor만의 전용 설정 파일이에요.&lt;br /&gt;한마디로, &lt;b&gt;AI에게 우리 팀의 개발 스타일을 알려주는 설명서&lt;/b&gt;예요  &lt;br /&gt;&lt;br /&gt;보통 새로운 프로젝트 들어갈 때,&lt;br /&gt;&quot;함수는 이렇게 짜자&quot;, &quot;스타일은 이렇다&quot; 같은 규칙이 있잖아요?&lt;br /&gt;이걸 &lt;b&gt;.cursorrules 파일에 글로 적기만&lt;/b&gt; 하면,&lt;br /&gt;Cursor의 AI가 그걸 읽고 &lt;b&gt;그 규칙에 맞는 코드&lt;/b&gt;를 제안해줘요 ✨&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt; ️ 사용 방법 간단 정리&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;프로젝트 루트 디렉토리에 &lt;code&gt;.cursorrules&lt;/code&gt; 파일 생성&lt;/li&gt;
&lt;li&gt;영어로 지침 작성&lt;/li&gt;
&lt;li&gt;저장만 해도 AI가 바로 적용(안될 시 Cursor 재시작하기)&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;mercury&quot;&gt;&lt;code&gt;You are an expert in React.
Use functional components only.
Follow camelCase for variables.
Avoid using inline styles.
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;  어디에 쓰면 좋을까?&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트마다 개발 규칙이 다를 때&lt;/li&gt;
&lt;li&gt;팀원끼리 코드 스타일 맞춰야 할 때&lt;/li&gt;
&lt;li&gt;내 코딩 습관을 AI에게 반영하고 싶을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;  협업할 때 진가 발휘!&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신입 개발자가 들어와도&lt;br /&gt;이 파일 하나만 공유하면 AI가 바로 학습해요.&lt;br /&gt;덕분에 &lt;b&gt;팀 전체 생산성&lt;/b&gt;이 쑥쑥 올라간답니다  &lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  꿀팁 2 : VS Code랑 완전 똑같아서 적응도 금방!&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cursor는 &lt;b&gt;VS Code 기반&lt;/b&gt;이라서&lt;br /&gt;기존에 쓰던 단축키, 테마, 확장 다 그대로 써요.&lt;br /&gt;GitHub 계정 로그인만 해도&lt;br /&gt;세팅 자동으로 불러와주니&lt;br /&gt;&lt;i&gt;&amp;ldquo;환경설정 이사 스트레스 0!&amp;rdquo;&lt;/i&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  꿀팁 3 : AI가 &amp;lsquo;대화하듯&amp;rsquo; 코딩 도와줘요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 한 줄 선택 후 &lt;b&gt;Ctrl + K&lt;/b&gt; 누르고&lt;br /&gt;&amp;ldquo;이거 리팩토링해줘&amp;rdquo;라고 말하면 끝이에요!&lt;br /&gt;&lt;br /&gt;자연어로&lt;br /&gt;&amp;ldquo;이 함수 어디에서 쓰였는지 알려줘&amp;rdquo;&lt;br /&gt;&amp;ldquo;이거 테스트 코드 짜줘&amp;rdquo;&lt;br /&gt;이런 식으로 대화하듯 지시할 수 있어요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  무료 체험도 알차게 쓰자!&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가입 시 2주간 Pro 플랜 무료&lt;/li&gt;
&lt;li&gt;2,000번의 자동완성 요청 가능&lt;/li&gt;
&lt;li&gt;50번의 고급 AI 요청 가능&lt;/li&gt;
&lt;li&gt;GPT-4 Turbo 기반 응답 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✍️ 마무리 한마디!&lt;/h3&gt;
&lt;p data-end=&quot;159&quot; data-start=&quot;117&quot; data-ke-size=&quot;size16&quot;&gt;사실 저도 아직 Cursor를&lt;br /&gt;&lt;b&gt;본격적으로 사용해보진 않았어요.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;226&quot; data-start=&quot;161&quot; data-ke-size=&quot;size16&quot;&gt;근데 요즘 개발자 커뮤니티나&lt;br /&gt;지인들 사이에서 &lt;b&gt;하도 핫해서&lt;/b&gt;&lt;br /&gt;저도 관심 갖고 열심히 정보 찾아봤거든요!&lt;/p&gt;
&lt;p data-end=&quot;290&quot; data-start=&quot;228&quot; data-ke-size=&quot;size16&quot;&gt;생산성도 높여주고,&lt;br /&gt;VS Code 기반이라 진입장벽도 없고&amp;hellip;&lt;br /&gt;진짜 유용할 것 같다는 생각이 들어요 &lt;/p&gt;
&lt;p data-end=&quot;342&quot; data-start=&quot;292&quot; data-ke-size=&quot;size16&quot;&gt;조만간 직접 설치해서&lt;br /&gt;실사용 해보고,&lt;br /&gt;&lt;b&gt;진짜 후기&lt;/b&gt;도 꼭 다시 공유드릴게요!&lt;/p&gt;
&lt;p data-end=&quot;387&quot; data-start=&quot;344&quot; data-ke-size=&quot;size16&quot;&gt;혹시 먼저 써보신 분들 있으시면&lt;br /&gt;댓글로 꿀팁 알려주셔도 대환영이에요 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;  &lt;a href=&quot;https://www.cursor.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기 클릭하면 설치할 수 있어요&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743388771034&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Cursor - The AI Code Editor&quot; data-og-description=&quot;Built to make you extraordinarily productive, Cursor is the best way to code with AI.&quot; data-og-host=&quot;www.cursor.com&quot; data-og-source-url=&quot;https://www.cursor.com/&quot; data-og-url=&quot;https://www.cursor.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hpQMO/hyYyL3z0Bu/w7P8nQpw6vLyGGJtOTvGp1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/KQ5Py/hyYxG26Cvp/jwLRv9TTLpsFuZbIckWmlk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.cursor.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.cursor.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hpQMO/hyYyL3z0Bu/w7P8nQpw6vLyGGJtOTvGp1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/KQ5Py/hyYxG26Cvp/jwLRv9TTLpsFuZbIckWmlk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Cursor - The AI Code Editor&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Built to make you extraordinarily productive, Cursor is the best way to code with AI.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.cursor.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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>개발자 모드/경험</category>
      <category>cursorai #ai개발툴 #mit개발자들 #개발생산성 #코드리팩토링 #개발자추천툴 #vscode기반 #cursorrules  #ai코딩도우미</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/64</guid>
      <comments>https://precious-value.tistory.com/64#entry64comment</comments>
      <pubDate>Mon, 31 Mar 2025 11:46:00 +0900</pubDate>
    </item>
    <item>
      <title>[ChatGPT]프롬프트 작성, 잘하면 2배는 더 똑똑해짐(Feat. o3)</title>
      <link>https://precious-value.tistory.com/63</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;GPT 잘 쓰고 싶은데, 뭘 어떻게 적어야 하죠??&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델에 뭘 시키고 싶은데 자꾸 뭔가 엇나감.&lt;br /&gt;말한 대로 안 되고, 애매하게 대충 돌아오는 응답 때문에 답답하셨던 분들 많을 것임..( &amp;zwj;♂️ 그게 바로 저예요..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 이거, 대부분 &lt;b&gt;프롬프트 문제&lt;/b&gt;입니다.&lt;br /&gt;GPT가 똑똑하긴 한데, &lt;b&gt;엉뚱하게 말해주면 엉뚱하게 듣는 똑똑이&lt;/b&gt;라서요 ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 &quot;프롬프트, 어떻게 잘 써야 하는지&quot;를&lt;br /&gt;정~말 실용적으로! 예제 중심으로!&lt;br /&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;color: #333333; text-align: start;&quot;&gt; OpenAI에서 제공하는 공식 프롬프트 가이드를 바탕으로 정리해서 포스팅했음!!&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심은 딱 하나, &amp;ldquo;간결하고 명확하게&amp;rdquo;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델한테 뭘 시키든 간에&lt;br /&gt;&lt;b&gt;말 복잡하게 돌리지 말고, 그냥 직설적으로 말해라.&lt;/b&gt;&lt;br /&gt;이게 정답임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 하나 들어볼게요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 이건 안 되는 예:&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;우리 회사의 최근 매출 증가 요인을 다양한 관점에서 분석해 주실 수 있나요? 그리고 여러 데이터들을 종합해서 앞으로의 예측도 해주세요.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람한테 말하는 것처럼 너무 친절함&amp;hellip; 근데 GPT는 이런 문장을 &quot;한 덩어리&quot;로 이해함.&lt;br /&gt;결과? 각 요청이 애매하게 섞여서 대충 추측해서 대답함.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 이렇게 바꾸면 됨:&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;최근 3년간 매출 데이터 기반으로 증가 요인을 분석하고, 향후 1년 매출 예측 결과(숫자 포함)를 300자 이내로 &lt;span data-grammar=&quot;{&amp;quot;input&amp;quot;:&amp;quot;요약해줘.&amp;rdquo;&amp;quot;,&amp;quot;output&amp;quot;:&amp;quot;요약해 줘.&amp;rdquo;&amp;quot;,&amp;quot;etype&amp;quot;:&amp;quot;space&amp;quot;}&quot; data-grammar-id=&quot;grammar1&quot; data-grammar-focus=&quot;false&quot;&gt;요약해줘.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심만 딱딱 떨어지게 말하니까&lt;br /&gt;GPT가 &amp;ldquo;아~ 분석하고, 요약하고, 숫자 포함해야겠구나&amp;rdquo; 하면서 정확하게 &lt;span data-grammar=&quot;{&amp;quot;input&amp;quot;:&amp;quot;처리함다.&amp;quot;,&amp;quot;output&amp;quot;:&amp;quot;처리합니다.&amp;quot;,&amp;quot;etype&amp;quot;:&amp;quot;spell&amp;quot;}&quot; data-grammar-id=&quot;grammar2&quot; data-grammar-focus=&quot;false&quot;&gt;처리함다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;구분 기호도 매우 중요함&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 데이터가 복잡해지면 &lt;b&gt;섹션을 명확하게 나눠야 &lt;span data-grammar=&quot;{&amp;quot;input&amp;quot;:&amp;quot;함다.&amp;quot;,&amp;quot;output&amp;quot;:&amp;quot;합니다.&amp;quot;,&amp;quot;etype&amp;quot;:&amp;quot;spell&amp;quot;}&quot; data-grammar-id=&quot;grammar3&quot; data-grammar-focus=&quot;false&quot;&gt;함다.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;사람한텐 쉬운 말도, GPT에겐 &quot;구분이 흐릿하면&quot; 정보 해석이 꼬일 수 있음.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 구분 없는 예:&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제품 A와 B의 차이점과 장단점을 알려줘. 그리고 고객 리뷰도 &lt;span data-grammar=&quot;{&amp;quot;input&amp;quot;:&amp;quot;반영해줘.&amp;quot;,&amp;quot;output&amp;quot;:&amp;quot;반영해 줘.&amp;quot;,&amp;quot;etype&amp;quot;:&amp;quot;space&amp;quot;}&quot; data-grammar-id=&quot;grammar5&quot; data-grammar-focus=&quot;false&quot;&gt;반영해줘.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 제품 설명과 리뷰가 섞여 들어가서 헷갈릴 수 있음.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 이렇게 바꿔야 함:&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제품 비교:&lt;br /&gt;제품 A: 주요 기능, 장단점 포함&lt;br /&gt;제품 B: 주요 기능, 장단점 포함&lt;br /&gt;[추가 자료: 고객 리뷰 50건 첨부]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요렇게 마크다운이나 태그, 혹은 대괄호 쓰면&lt;br /&gt;GPT가 구조적으로 데이터를 이해할 수 있음.&lt;br /&gt;단순하지만 &lt;b&gt;효과 &lt;span data-grammar=&quot;{&amp;quot;input&amp;quot;:&amp;quot;직빵임다.&amp;quot;,&amp;quot;output&amp;quot;:&amp;quot;직빵입니다.&amp;quot;,&amp;quot;etype&amp;quot;:&amp;quot;spell&amp;quot;}&quot; data-grammar-id=&quot;grammar6&quot; data-grammar-focus=&quot;false&quot;&gt;직빵&lt;/span&gt;&lt;/b&gt;&lt;span data-grammar=&quot;{&amp;quot;input&amp;quot;:&amp;quot;직빵임다.&amp;quot;,&amp;quot;output&amp;quot;:&amp;quot;직빵입니다.&amp;quot;,&amp;quot;etype&amp;quot;:&amp;quot;spell&amp;quot;}&quot; data-grammar-id=&quot;grammar6&quot; data-grammar-focus=&quot;false&quot;&gt;임다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;산출물 형태도 정해줘야 함&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;이거 해줘&quot;만 하면 뭘 어떻게 해줄지 GPT도 모름.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  꼭 넣어야 할 것들:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과물 형식 (예: bullet point, 테이블 등)&lt;/li&gt;
&lt;li&gt;분량 제한 (예: 500자 이내)&lt;/li&gt;
&lt;li&gt;포함할 요소 (예: 숫자, 그래프 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;500자 이내로, 3가지 핵심 전략을 bullet point로 정리한 마케팅 전략을 &lt;span data-grammar=&quot;{&amp;quot;input&amp;quot;:&amp;quot;작성해줘.&amp;rdquo;&amp;quot;,&amp;quot;output&amp;quot;:&amp;quot;작성해 줘.&amp;rdquo;&amp;quot;,&amp;quot;etype&amp;quot;:&amp;quot;space&amp;quot;}&quot; data-grammar-id=&quot;grammar8&quot; data-grammar-focus=&quot;false&quot;&gt;작성해줘.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 GPT가 머릿속으로 &lt;span data-grammar=&quot;{&amp;quot;input&amp;quot;:&amp;quot;시뮬레이션 하면서&amp;quot;,&amp;quot;output&amp;quot;:&amp;quot;시뮬레이션하면서&amp;quot;,&amp;quot;etype&amp;quot;:&amp;quot;space&amp;quot;}&quot; data-grammar-id=&quot;grammar9&quot; data-grammar-focus=&quot;false&quot;&gt;시뮬레이션 하면서&lt;/span&gt; 작업함.&lt;br /&gt;그냥 &quot;전략 짜줘&quot;라고 하면 글로 길게 쓰고 중복될 수도 있음다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;체인 오브 &lt;span data-grammar=&quot;{&amp;quot;input&amp;quot;:&amp;quot;씽크(chain&amp;quot;,&amp;quot;output&amp;quot;:&amp;quot;싱크(chain&amp;quot;,&amp;quot;etype&amp;quot;:&amp;quot;spell&amp;quot;}&quot; data-grammar-id=&quot;grammar10&quot; data-grammar-focus=&quot;false&quot;&gt;씽크(chain&lt;/span&gt; of thought)? 쓰지 &lt;span data-grammar=&quot;{&amp;quot;input&amp;quot;:&amp;quot;마셈&amp;quot;,&amp;quot;output&amp;quot;:&amp;quot;마세요&amp;quot;,&amp;quot;etype&amp;quot;:&amp;quot;spell&amp;quot;}&quot; data-grammar-id=&quot;grammar11&quot; data-grammar-focus=&quot;false&quot;&gt;마셈&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 좀 헷갈릴 수 있는데요,&lt;br /&gt;&amp;ldquo;단계별로 &lt;span data-grammar=&quot;{&amp;quot;input&amp;quot;:&amp;quot;생각해봐&amp;rdquo;&amp;quot;,&amp;quot;output&amp;quot;:&amp;quot;생각해 봐&amp;rdquo;&amp;quot;,&amp;quot;etype&amp;quot;:&amp;quot;space&amp;quot;}&quot; data-grammar-id=&quot;grammar12&quot; data-grammar-focus=&quot;false&quot;&gt;생각해봐&amp;rdquo;&lt;/span&gt; 같은 요청은 &lt;b&gt;모델 성능을 오히려 떨어뜨릴 수 있음.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT는 '단계적으로 추론하라'는 말을&lt;br /&gt;명령이 아니라 &lt;b&gt;노이즈&lt;/b&gt;처럼 받아들일 수 있음다.&lt;br /&gt;특히 복잡한 o3 모델에서는 이게 더 &lt;span data-grammar=&quot;{&amp;quot;input&amp;quot;:&amp;quot;문제됨.&amp;quot;,&amp;quot;output&amp;quot;:&amp;quot;문제 됨.&amp;quot;,&amp;quot;etype&amp;quot;:&amp;quot;space&amp;quot;}&quot; data-grammar-id=&quot;grammar13&quot; data-grammar-focus=&quot;false&quot;&gt;문제됨.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론?&lt;br /&gt;  그냥 결과 중심으로 &lt;span data-grammar=&quot;{&amp;quot;input&amp;quot;:&amp;quot;요약해달라고만&amp;quot;,&amp;quot;output&amp;quot;:&amp;quot;요약해 달라고만&amp;quot;,&amp;quot;etype&amp;quot;:&amp;quot;space&amp;quot;}&quot; data-grammar-id=&quot;grammar14&quot; data-grammar-focus=&quot;false&quot;&gt;요약해달라고만 하셈!&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;일단 제로샷 &amp;rarr; 필요하면 예시 추가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음부터 예시를 빽빽하게 넣지 말고,&lt;br /&gt;&lt;b&gt;일단 간단히 시켜보고&lt;/b&gt; 결과가 만족스럽지 않을 때&lt;br /&gt;&amp;ldquo;이런 식으로 해줘&amp;rdquo; 예제를 넣는 게 제일 좋음다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 형식으로 &lt;span data-grammar=&quot;{&amp;quot;input&amp;quot;:&amp;quot;작성해줘.&amp;quot;,&amp;quot;output&amp;quot;:&amp;quot;작성해 줘.&amp;quot;,&amp;quot;etype&amp;quot;:&amp;quot;space&amp;quot;}&quot; data-grammar-id=&quot;grammar17&quot; data-grammar-focus=&quot;false&quot;&gt;작성해줘.&lt;/span&gt;&lt;br /&gt;예제:&lt;br /&gt;항목 1: 내용&lt;br /&gt;항목 2: 내용&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러면 모델이 딱 그 포맷에 맞춰 응답함.&lt;br /&gt;응답 일관성 잡기 진짜 쉬워짐.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✨ 핵심 요약! 실전에서 이렇게 &lt;span data-grammar=&quot;{&amp;quot;input&amp;quot;:&amp;quot;써보셈!&amp;quot;,&amp;quot;output&amp;quot;:&amp;quot;써보세요!&amp;quot;,&amp;quot;etype&amp;quot;:&amp;quot;spell&amp;quot;}&quot; data-grammar-id=&quot;grammar18&quot; data-grammar-focus=&quot;false&quot;&gt;써보셈!&lt;/span&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;간단명료하게 요구하기&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;핵심 키워드, 요구 조건만 쏙쏙.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;입력 구분 기호 사용&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마크다운, XML, 대괄호, 섹션 헤더 적극 활용.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;산출물 포맷과 조건 명시&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;형식, 길이, 포함 정보 미리 딱 정리.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;체인 오브 &lt;span data-grammar=&quot;{&amp;quot;input&amp;quot;:&amp;quot;씽크는&amp;quot;,&amp;quot;output&amp;quot;:&amp;quot;싱크는&amp;quot;,&amp;quot;etype&amp;quot;:&amp;quot;spell&amp;quot;}&quot; data-grammar-id=&quot;grammar19&quot; data-grammar-focus=&quot;false&quot;&gt;씽크는&lt;/span&gt; 안 쓰는 게 낫다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;추론 유도 X, 결과만 요청!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;제로샷 먼저, 부족하면 예시 추가&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GPT한테 기회를 한 번 주고, 보완은 나중에.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Q&amp;amp;A&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  GPT가 자꾸 헛소리하는데 왜 그래요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  대부분 프롬프트가 애매하거나, 요구 조건이 빠졌기 때문임. &amp;ldquo;정확하게 뭐 해야 하는지&amp;rdquo; 써주면 훨씬 좋아짐.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  마크다운이 꼭 필요한가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  꼭은 아님. 근데 구조적인 정보 구분에 유리해서 권장함. 가독성도 좋아서 나중에 재활용할 때 편함!&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  한 번에 너무 많은 &lt;span data-grammar=&quot;{&amp;quot;input&amp;quot;:&amp;quot;요청하면&amp;quot;,&amp;quot;output&amp;quot;:&amp;quot;요청 하면&amp;quot;,&amp;quot;etype&amp;quot;:&amp;quot;space&amp;quot;}&quot; data-grammar-id=&quot;grammar20&quot; data-grammar-focus=&quot;false&quot;&gt;요청하면&lt;/span&gt; 안 되나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  네. 가급적이면 1~2개씩 요청하고, 단계적으로 시도하는 게 더 안정적임. 모델이 폭주할 수 있음!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  GPT를 잘 쓰는 것도 실력입니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 개발자들 사이에서 GPT 잘 쓰는 사람 = 생산성 2배&lt;br /&gt;이건 진짜 데이터로 증명되고 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 리뷰, 요약, 기획안 초안, 번역&amp;hellip;&lt;br /&gt;잘만 쓰면 30분짜리 일이 5분 컷!&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;&quot;한 줄&quot; 잘 써도 10배 &lt;span data-grammar=&quot;{&amp;quot;input&amp;quot;:&amp;quot;편해짐다.&amp;quot;,&amp;quot;output&amp;quot;:&amp;quot;편해진다.&amp;quot;,&amp;quot;etype&amp;quot;:&amp;quot;spell&amp;quot;}&quot; data-grammar-id=&quot;grammar21&quot; data-grammar-focus=&quot;false&quot;&gt;편해짐다.&lt;/span&gt;&lt;br /&gt;다들, 꼭 한번 &lt;span data-grammar=&quot;{&amp;quot;input&amp;quot;:&amp;quot;적용해보세요!&amp;quot;,&amp;quot;output&amp;quot;:&amp;quot;적용해 보세요!&amp;quot;,&amp;quot;etype&amp;quot;:&amp;quot;space&amp;quot;}&quot; data-grammar-id=&quot;grammar22&quot; data-grammar-focus=&quot;false&quot;&gt;적용해보세요!&lt;/span&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;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt; 참조 사이트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://platform.openai.com/docs/guides/reasoning?api-mode=chat&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://platform.openai.com/docs/guides/reasoning?api-mode=chat&lt;/a&gt;&lt;/p&gt;</description>
      <category>개발자 모드/개념</category>
      <category>ChatGPT</category>
      <category>GPT 활용법</category>
      <category>프롬프트 작성법</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/63</guid>
      <comments>https://precious-value.tistory.com/63#entry63comment</comments>
      <pubDate>Fri, 21 Mar 2025 11:57:43 +0900</pubDate>
    </item>
    <item>
      <title>[Django Silk]로 성능 최적화 및 분석 시작하기!</title>
      <link>https://precious-value.tistory.com/62</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;포스팅 계기&lt;br /&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;252&quot; data-start=&quot;39&quot; data-ke-size=&quot;size16&quot;&gt;최근 Django DRF를 사용해 API를 개발하면서 &lt;b&gt;요청-응답 속도가 매우 느리게 나오는&lt;/b&gt; 이슈를 경험함. 이를 해결하기 위해 여러 방법을 시도했는데, 그중에서도 &lt;b&gt;모든 데이터를 쿼리해오는 것이 아니라 상황에 맞는 데이터만 최대한 가져오는 방식&lt;/b&gt;으로 쿼리셋을 최적화하는 등 여러 가지 개선을 해봤음. 하지만 이 과정에서 여전히 &lt;b&gt;불편한 점&lt;/b&gt;이 많았음.&lt;/p&gt;
&lt;p data-end=&quot;252&quot; data-start=&quot;39&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;490&quot; data-start=&quot;254&quot; data-ke-size=&quot;size16&quot;&gt;그 중 하나가 바로 &lt;b&gt;기존에 사용하고 있던 Django Debug Toolbar&lt;/b&gt; 라이브러리였음. 이 툴은 &lt;b&gt;swagger에서 요청-응답 속도를 확인할 수 없어서&lt;/b&gt;, 따로 &lt;b&gt;서버에서 디버그 모드로 수동으로 확인&lt;/b&gt;하며 성능을 체크해야 했음. 이런 방식이 &lt;b&gt;시간이 많이 걸리고 비효율적&lt;/b&gt;이라 느꼈고, &lt;b&gt;응답 속도뿐만 아니라 성능 최적화&lt;/b&gt;에 도움이 되는 다른 라이브러리가 필요하다고 생각함.&lt;/p&gt;
&lt;p data-end=&quot;490&quot; data-start=&quot;254&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;593&quot; data-start=&quot;492&quot; data-ke-size=&quot;size16&quot;&gt;이런 고민을 해결할 수 있는 라이브러리로 &lt;b&gt;Django Silk&lt;/b&gt;를 알게 되었고, 이번 포스팅에서는 &lt;b&gt;Django Silk&lt;/b&gt;가 무엇인지, 어떻게 사용하는지 알아보겠음. (매우 간단한 건 안 비밀~ )&lt;/p&gt;
&lt;p data-end=&quot;593&quot; data-start=&quot;492&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;593&quot; data-start=&quot;492&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/jazzband/django-silk&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/jazzband/django-silk&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741765396934&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - jazzband/django-silk: Silky smooth profiling for Django&quot; data-og-description=&quot;Silky smooth profiling for Django. Contribute to jazzband/django-silk development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/jazzband/django-silk&quot; data-og-url=&quot;https://github.com/jazzband/django-silk&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bjuv8Y/hyYqcUSVXA/J9lV43kyhBwOkqqom6RBA0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/KuCdR/hyYqaJwPoF/JKZD8nQBoDAPscx5tDDUV0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/jazzband/django-silk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/jazzband/django-silk&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bjuv8Y/hyYqcUSVXA/J9lV43kyhBwOkqqom6RBA0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/KuCdR/hyYqaJwPoF/JKZD8nQBoDAPscx5tDDUV0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - jazzband/django-silk: Silky smooth profiling for Django&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Silky smooth profiling for Django. Contribute to jazzband/django-silk development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;※ Django Silk란?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Django Silk는 Django 애플리케이션의 성능을 분석하고 최적화하는 데 도움을 주는 프로파일링 도구임. Silk는 요청-응답 주기의 성능을 실시간으로 모니터링하고, 데이터베이스 쿼리의 실행 시간과 빈도를 분석하여 애플리케이션의 성능 병목 지점을 식별할 수 있게 도와줌.&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt; Django Silk 설치 및 설정 방법 &lt;/b&gt;&lt;/span&gt;&lt;/h4&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. &lt;b&gt;Django Silk 설치&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741765495597&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install django-silk&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;909&quot; data-start=&quot;878&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;909&quot; data-start=&quot;878&quot; data-ke-size=&quot;size16&quot;&gt;2. &lt;b&gt;INSTALLED_APPS에 추가&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;909&quot; data-start=&quot;878&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;962&quot; data-start=&quot;911&quot; data-ke-size=&quot;size16&quot;&gt;settings.py 파일에서 INSTALLED_APPS에 'silk'를 추가함&lt;/p&gt;
&lt;pre id=&quot;code_1741765542021&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSTALLED_APPS = [
    # 기존 앱들...
    'silk',
]&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;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1054&quot; data-start=&quot;1027&quot; data-ke-size=&quot;size16&quot;&gt;3. &lt;b&gt;MIDDLEWARE에 추가&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1054&quot; data-start=&quot;1027&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1093&quot; data-start=&quot;1056&quot; data-ke-size=&quot;size16&quot;&gt;MIDDLEWARE에 SilkyMiddleware를 추가함&lt;/p&gt;
&lt;p data-end=&quot;1093&quot; data-start=&quot;1056&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741765564025&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MIDDLEWARE = [
    # 기존 미들웨어들...
    'silk.middleware.SilkyMiddleware',
]&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;주의: SilkyMiddleware는 일반적으로 세션 미들웨어와 인증 미들웨어 사이에 배치하는 것이 좋음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1285&quot; data-start=&quot;1249&quot; data-ke-size=&quot;size16&quot;&gt;4. &lt;b&gt;urls.py에 Silk URL 패턴 추가&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1285&quot; data-start=&quot;1249&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1337&quot; data-start=&quot;1287&quot; data-ke-size=&quot;size16&quot;&gt;urls.py에 Silk의 URL 패턴을 추가하여 대시보드에 접근할 수 있도록 설정함:&lt;/p&gt;
&lt;p data-end=&quot;1337&quot; data-start=&quot;1287&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741765597084&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.urls import path, include

urlpatterns = [
    # 기존 URL 패턴들...
    path('silk/', include('silk.urls', namespace='silk')),
]&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;5. &lt;b&gt;데이터베이스 마이그레이션 및 정적 파일 수집(DB에 반영)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741765641831&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py migrate
python manage.py collectstatic&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;1619&quot; data-start=&quot;1601&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;Django Silk 사용법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1638&quot; data-start=&quot;1621&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로파일링 활성화&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1638&quot; data-start=&quot;1621&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1682&quot; data-start=&quot;1640&quot; data-ke-size=&quot;size16&quot;&gt;settings.py에 다음 설정을 추가하여 프로파일링 기능을 활성화함&lt;/p&gt;
&lt;pre id=&quot;code_1741765800705&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SILKY_PYTHON_PROFILER = True&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;/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;할 수 있음. 이를 위해 SILKY_INTERCEPT_PERCENT를 사용해 &lt;b&gt;몇 퍼센트의 요청에 대해서만 프로파일링을 할지&lt;/b&gt; 결정할 수 있음.&lt;/p&gt;
&lt;pre id=&quot;code_1741765849931&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SILKY_INTERCEPT_PERCENT = 5  # 5%의 요청만 프로파일링&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1750&quot; data-start=&quot;1728&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1750&quot; data-start=&quot;1728&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;특정 뷰에 프로파일링 적용&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1750&quot; data-start=&quot;1728&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1806&quot; data-start=&quot;1752&quot; data-ke-size=&quot;size16&quot;&gt;프로파일링을 원하는 뷰에 @silk_profile 데코레이터를 추가하여 성능 데이터를 수집함&lt;/p&gt;
&lt;pre id=&quot;code_1741765872461&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from silk.profiling.profiler import silk_profile

@silk_profile(name='View Blog Post')
def post(request, post_id):
    p = Post.objects.get(pk=post_id)
    return render(request, 'post.html', {'post': p})&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;이렇게 설정하면 해당 뷰에 대한 성능 데이터가 Silk 대시보드에 표시됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;2096&quot; data-start=&quot;2076&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;실무 경험을 바탕으로 한 장단점&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;2109&quot; data-start=&quot;2098&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;장점:&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2334&quot; data-start=&quot;2111&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2241&quot; data-start=&quot;2111&quot;&gt;&lt;b&gt;상세한 성능 분석&lt;/b&gt;: Silk를 통해 각 요청에 대한 처리 시간, 데이터베이스 쿼리 실행 시간, 쿼리 빈도 등을 상세하게 분석할 수 있었음. 이를 통해 &lt;b&gt;성능 병목&lt;/b&gt;이 발생하는 지점을 명확히 파악하고 최적화할 수 있었음.&lt;/li&gt;
&lt;li data-end=&quot;2334&quot; data-start=&quot;2245&quot;&gt;&lt;b&gt;실시간 모니터링&lt;/b&gt;: Silk는 실시간으로 성능 데이터를 시각화해 주므로, &lt;b&gt;즉각적인 피드백&lt;/b&gt;을 제공하고 필요한 부분을 신속하게 최적화할 수 있었음.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2347&quot; data-start=&quot;2336&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;단점:&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2628&quot; data-start=&quot;2349&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2501&quot; data-start=&quot;2349&quot;&gt;&lt;b&gt;운영 환경에서의 데이터베이스 부하&lt;/b&gt;: Silk는 모든 요청과 응답 데이터를 데이터베이스에 저장함. 이로 인해 &lt;b&gt;운영 환경&lt;/b&gt;에서 사용할 때 데이터베이스 부하가 증가할 수 있음. 이를 해결하려면, 프로파일링을 일부 트래픽에 대해서만 적용하도록 설정하는 것이 좋음.&lt;/li&gt;
&lt;li data-end=&quot;2628&quot; data-start=&quot;2503&quot;&gt;&lt;b&gt;보안 및 개인정보 보호&lt;/b&gt;: Silk는 요청 및 응답 본문을 기록하는데, 이로 인해 민감한 정보가 노출될 수 있음. 이를 방지하기 위해 Silk의 설정을 통해 민감한 데이터를 마스킹하거나 제외하는 보안 조치가 필요함.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;2640&quot; data-start=&quot;2635&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;결론&lt;/span&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2811&quot; data-start=&quot;2642&quot; data-ke-size=&quot;size16&quot;&gt;Django Silk는 애플리케이션의 성능 분석과 최적화에 유용한 도구로, 개발 및 운영 환경에서 성능 모니터링을 쉽게 할 수 있게 도와줌. 다만 운영 환경에서의 &lt;b&gt;데이터베이스 부하&lt;/b&gt;와 &lt;b&gt;보안 문제&lt;/b&gt;를 고려하여 신중하게 사용해야 하며, 필요한 설정을 조정하여 최적의 성능을 유지하는 것이 중요할 듯.&lt;/p&gt;
&lt;p data-end=&quot;2811&quot; data-start=&quot;2642&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2907&quot; data-start=&quot;2813&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Django Silk&lt;/b&gt;를 활용하여 애플리케이션의 성능을 &lt;b&gt;정확하게 분석하고 최적화&lt;/b&gt;할 수 있었던 경험을 바탕으로, 앞으로의 프로젝트에도 큰 도움이 되지 않을까.. 생각함!! 그럼 다음에 또 찾아오겠음! &lt;/p&gt;
&lt;p data-end=&quot;2907&quot; data-start=&quot;2813&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2907&quot; data-start=&quot;2813&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 모드/응용</category>
      <category>django-silk</category>
      <category>라이브러리</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/62</guid>
      <comments>https://precious-value.tistory.com/62#entry62comment</comments>
      <pubDate>Wed, 12 Mar 2025 16:55:23 +0900</pubDate>
    </item>
    <item>
      <title>[Docker]AWS Ubuntu 서버에 도커 설치하기</title>
      <link>https://precious-value.tistory.com/61</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt; ️포스팅 계기&lt;/b&gt;&lt;/blockquote&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;
&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;하지만 문제가 DB에 데이터가 없기때문에 테스트하기에 제한적이라는 점!!&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;기존에 사용중이던 AWS RDS - PostgreSQL DB 서버에 메인 DB 데이터를 복원시키는 것!!&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;이 방법은 가장 간단하고 빠르지만 AWS RDS가 무료가 아니기에 비용이 추가적으로 발생함.&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;저번에 로컬에 세팅한 도커 컴포즈 설정을 AWS 서버에 세팅하여&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;도커로 PostgreSQL 컨테이너를 만들어 비용도 없고, 메인 DB 데이터 복원도 간단하게 할 수 있게 세팅 해볼 예정임!!&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;그러기 위해서는 AWS 서버에 도커와 도커 컴포즈를 설치해야하는데 그 과정을 포스팅 해보겠음~ &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;a href=&quot;https://precious-value.tistory.com/57&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.09.11 - [개발자 모드/응용] - [CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[1편]&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;에서 언급한 적 있지만!! 중요한 부분인 듯 하여 따로 포스팅을 하였음~! &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 도커 설치&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 먼저 각자 도커와 도커 컴포즈를 설치할 AWS 서버에 접속!!&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;pre id=&quot;code_1730352170898&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 시스템의 패키지 목록을 최신 상태로 업데이트
sudo apt update 
# 설치된 패키지들을 최신 버전으로 업그레이드를 하는데 
# 사용자가 입력하는 옵션 없이 자동으로 진행되도록 함
sudo apt upgrade -y&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1730352301948&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install -y apt-transport-https ca-certificates curl software-properties-common&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;도커를 설치하려면 HTTPS를 통한 패키지 다운로드, 인증서 관리, 외부 저장소 추가가 필요함.&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;pre id=&quot;code_1730353657640&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg&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;이 명령어는 도커의 패키지에 대한 인증을 위해 GPG 키를 추가함.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;※ GPG 키란?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;데이터의 무결성과 출처의 신뢰성을 보장하기 위해 사용되는 암호화 키&lt;br /&gt;GPG는 GNU Privacy Guard의 약자로, 데이터를 암호화하고 서명하여 보안을 강화하는 방식 중 하나이며, 공개 키와 개인키로 구성되어 있음.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;curl을 사용해 키를 다운로드하고, gpg를 통해 Ubuntu 시스템의 신뢰할 수 있는 키 목록에 저장함.&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;pre id=&quot;code_1730354085612&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo &quot;deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable&quot; | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null&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;Docker의 패키지 저장소 정보를 시스템의 /etc/apt/sources.list.d/docker.list 파일에 추가하여, 패키지 관리자가 Docker 패키지를 설치하거나 업데이트할 때 사용할 수 있도록 설정함.&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;- $(dpkg --print-architecture) : 현재 시스템의 아키텍처(x86, x86_64, ARM 등)를 자동으로 확인해 저장소 링크에 반영&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- $(lsb_release -cs) : 현재 Ubuntu 배포 코드를 확인해 적절한 버전을 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &amp;gt; /dev/null : tee 명령어의 출력을 /dev/null로 리디렉션하여 화면에 출력되지 않도록 함.&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;이후 아래 명령어를 입력하여 패키지 목록을 최신화 한 뒤, docker 엔진을 설치함.&lt;/p&gt;
&lt;pre id=&quot;code_1730363577836&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt update
sudo apt install -y docker-ce&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;docker-ce는 Docker Community Edition으로, 오픈 소스이며 무료로 제공함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EBvvz/btsKr7moYFX/Bs8TG2DjV06DjWxmVTkzAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EBvvz/btsKr7moYFX/Bs8TG2DjV06DjWxmVTkzAK/img.png&quot; data-alt=&quot;서비스 재시작 알람 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EBvvz/btsKr7moYFX/Bs8TG2DjV06DjWxmVTkzAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEBvvz%2FbtsKr7moYFX%2FBs8TG2DjV06DjWxmVTkzAK%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;487&quot; height=&quot;297&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;297&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;혹 필자처럼 서비스를 재시작해야한다는 화면이 나온다면&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;크게 상관이 없다고 가정하고 모든 서비스를 체크 후 ok를 진행하면 됨!!&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;탭키를 누르면 Ok와 Cancle 사이를 이동할 수 있고 선택했다면 엔터를 누르면 됨!!&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;pre id=&quot;code_1730364289858&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl status docker&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;systemctl 명령어로 도커 서비스가 정상적으로 실행되는지를 확인!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGp37G/btsKsAO3NdG/d0dcf7hJGhS0Zmrv7SHzZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGp37G/btsKsAO3NdG/d0dcf7hJGhS0Zmrv7SHzZK/img.png&quot; data-alt=&quot;도커 상태 확인 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGp37G/btsKsAO3NdG/d0dcf7hJGhS0Zmrv7SHzZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGp37G%2FbtsKsAO3NdG%2Fd0dcf7hJGhS0Zmrv7SHzZK%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;750&quot; height=&quot;188&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;188&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;Active: &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;active (running)&lt;/b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;로 나오고 있다면 정상적으로 설치가 되었음!!&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&gt;&lt;span style=&quot;color: #666666;&quot;&gt;또는&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1730364425363&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo docker ps&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;2. 도커 컴포즈 설치&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;도커만 잘 설치되었다면 도커 컴포즈는 금방 설치할 수 있음!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1730364543691&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo curl -L &quot;https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)&quot; -o /usr/local/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;curl -L 명령어로 지정된 URL에서 도커 컴포즈의 최신 버전 파일을 다운로드하여 /usr/local/bin/docker-compose 경로에 저장함!!&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;- $(uname -s) : 운영 체제 이름을 반환(필자의 경우 &amp;gt; Linux)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- $(uname -m) : 시스템 아키텍처 반환(필자의 경우 &amp;gt; x86_64)&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;uname 명령어는 커맨드에서 사용해보면 바로 알 수 있음!!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;147&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz3glV/btsKsoag5nY/qYHBUf830V79elbSCM8zKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz3glV/btsKsoag5nY/qYHBUf830V79elbSCM8zKK/img.png&quot; data-alt=&quot;uname 명령어 결과 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz3glV/btsKsoag5nY/qYHBUf830V79elbSCM8zKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz3glV%2FbtsKsoag5nY%2FqYHBUf830V79elbSCM8zKK%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;147&quot; height=&quot;72&quot; data-origin-width=&quot;147&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;uname 명령어 결과 화면&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;그리고 도커 컴포즈 명령어를 실행하기 위해 도커 컴포즈 바이너리 파일에 실행 권한을 부여해야 함!&lt;/p&gt;
&lt;pre id=&quot;code_1730364785036&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo chmod +x /usr/local/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;권한이 올바르게 적용되었다면&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1730364911214&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker-compose --version&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;258&quot; data-origin-height=&quot;31&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcx3JB/btsKqNo5grK/EEaX42g7kY5WZH8SUfI95k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcx3JB/btsKqNo5grK/EEaX42g7kY5WZH8SUfI95k/img.png&quot; data-alt=&quot;도커 컴포즈 버전 확인 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcx3JB/btsKqNo5grK/EEaX42g7kY5WZH8SUfI95k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdcx3JB%2FbtsKqNo5grK%2FEEaX42g7kY5WZH8SUfI95k%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;258&quot; height=&quot;31&quot; data-origin-width=&quot;258&quot; data-origin-height=&quot;31&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;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;/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;긴 글 읽으시느라 고생하셨음!! ️&lt;/p&gt;</description>
      <category>개발자 모드/개념</category>
      <category>Docker</category>
      <category>도커</category>
      <category>도커 및 도커 컴포즈 설치</category>
      <category>도커컴포즈</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/61</guid>
      <comments>https://precious-value.tistory.com/61#entry61comment</comments>
      <pubDate>Thu, 31 Oct 2024 18:02:23 +0900</pubDate>
    </item>
    <item>
      <title>[CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[4편]</title>
      <link>https://precious-value.tistory.com/60</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://precious-value.tistory.com/59&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.09.12 - [개발자 모드/응용] - [CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[3편]&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1726189805179&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[3편]&quot; data-og-description=&quot;2024.09.12 - [개발자 모드/응용] - [CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[2편]&amp;nbsp;[CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[2편]2024.09.11 - [개발자 모드/응용] - [CI/CD] Docker로 Jenkins &quot; data-og-host=&quot;precious-value.tistory.com&quot; data-og-source-url=&quot;https://precious-value.tistory.com/59&quot; data-og-url=&quot;https://precious-value.tistory.com/59&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c56mUJ/hyW23LtVe1/1bmoyuJkaOBCXNNBkkR4N0/img.gif?width=224&amp;amp;height=224&amp;amp;face=96_20_153_82,https://scrap.kakaocdn.net/dn/Atjna/hyW2UgHpi0/RJZYueydLk0ks0CiXMdm11/img.gif?width=224&amp;amp;height=224&amp;amp;face=96_20_153_82,https://scrap.kakaocdn.net/dn/Xbbxk/hyW2RK2hA8/CiOFn80wXXisjaFHGqKgzk/img.png?width=1301&amp;amp;height=662&amp;amp;face=0_0_1301_662&quot;&gt;&lt;a href=&quot;https://precious-value.tistory.com/59&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://precious-value.tistory.com/59&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c56mUJ/hyW23LtVe1/1bmoyuJkaOBCXNNBkkR4N0/img.gif?width=224&amp;amp;height=224&amp;amp;face=96_20_153_82,https://scrap.kakaocdn.net/dn/Atjna/hyW2UgHpi0/RJZYueydLk0ks0CiXMdm11/img.gif?width=224&amp;amp;height=224&amp;amp;face=96_20_153_82,https://scrap.kakaocdn.net/dn/Xbbxk/hyW2RK2hA8/CiOFn80wXXisjaFHGqKgzk/img.png?width=1301&amp;amp;height=662&amp;amp;face=0_0_1301_662');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[3편]&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2024.09.12 - [개발자 모드/응용] - [CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[2편]&amp;nbsp;[CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[2편]2024.09.11 - [개발자 모드/응용] - [CI/CD] Docker로 Jenkins&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;precious-value.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저번 편까지 CI를 마무리했고, 이제는 대망의 CD만 남았음!!&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;장고 백엔드 서버에 접속한 뒤 GIT을 통해 소스를 업데이트하여 배포를 함!!&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;그렇기 때문에 자동적 배포를 진행하기 위해 젠킨스에서 Job을 만들어주어야 함!! &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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;[4편] 젠킨스에서 배포를 담당할 Job 설정&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;color: #333333;&quot;&gt;먼저 젠킨스 서버에 접속한 뒤 대시보드에서 New Item을 선택하여 Freestyle Project를 생성함!!(아이템명은 독자분들 마음대로~)&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;이후 Job 구성 페이지에서 저번에 한 것처럼 [소스 코드 관리] &amp;gt; git을 선택!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1547&quot; data-origin-height=&quot;814&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coYto9/btsJB6aqerz/Svqrile67fW0EUhEEnR8WK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coYto9/btsJB6aqerz/Svqrile67fW0EUhEEnR8WK/img.png&quot; data-alt=&quot;젠킨스 job 설정 화면 1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coYto9/btsJB6aqerz/Svqrile67fW0EUhEEnR8WK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoYto9%2FbtsJB6aqerz%2FSvqrile67fW0EUhEEnR8WK%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;787&quot; height=&quot;414&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1547&quot; data-origin-height=&quot;814&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;젠킨스 job 설정 화면 1&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;그리고 배포를 하고 싶은 깃 레포지토리에 접속해서~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btYefG/btsJBoo5xqp/X3AxgGmVzWEk9F0U9T1Ic0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btYefG/btsJBoo5xqp/X3AxgGmVzWEk9F0U9T1Ic0/img.png&quot; data-alt=&quot;깃 레포지토리 url&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btYefG/btsJBoo5xqp/X3AxgGmVzWEk9F0U9T1Ic0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtYefG%2FbtsJBoo5xqp%2FX3AxgGmVzWEk9F0U9T1Ic0%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;298&quot; height=&quot;272&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;깃 레포지토리 url&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;해당 버튼으로 레포지토리 URL을 복사해서 넣어주고, 저번 시간에 등록한 [ &lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;Credentials]를 선택!&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: #14141f; text-align: start;&quot;&gt;등록을 하지 않았다면 아래 링크에서 등록을 하고 진행하시길!! &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;&lt;a href=&quot;https://precious-value.tistory.com/58&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://precious-value.tistory.com/58&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1726190856407&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[2편]&quot; data-og-description=&quot;2024.09.11 - [개발자 모드/응용] - [CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[1편]&amp;nbsp;[CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[1편]평소 CI/CD에 대해서 관심은 있었지만 직접 경험해 &quot; data-og-host=&quot;precious-value.tistory.com&quot; data-og-source-url=&quot;https://precious-value.tistory.com/58&quot; data-og-url=&quot;https://precious-value.tistory.com/58&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dSIxRn/hyW2UOwWZl/OQXmVQOLwcRqWfWfXS1e7K/img.gif?width=498&amp;amp;height=498&amp;amp;face=149_154_270_286,https://scrap.kakaocdn.net/dn/MyGnu/hyW2P7w0t6/UXWKmbmJCuSb2ddRFxdKHk/img.gif?width=498&amp;amp;height=498&amp;amp;face=149_154_270_286,https://scrap.kakaocdn.net/dn/vlilz/hyWZcQOCxP/eMJ9IXwt1zVewTanYJqZh0/img.png?width=1020&amp;amp;height=885&amp;amp;face=0_0_1020_885&quot;&gt;&lt;a href=&quot;https://precious-value.tistory.com/58&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://precious-value.tistory.com/58&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dSIxRn/hyW2UOwWZl/OQXmVQOLwcRqWfWfXS1e7K/img.gif?width=498&amp;amp;height=498&amp;amp;face=149_154_270_286,https://scrap.kakaocdn.net/dn/MyGnu/hyW2P7w0t6/UXWKmbmJCuSb2ddRFxdKHk/img.gif?width=498&amp;amp;height=498&amp;amp;face=149_154_270_286,https://scrap.kakaocdn.net/dn/vlilz/hyWZcQOCxP/eMJ9IXwt1zVewTanYJqZh0/img.png?width=1020&amp;amp;height=885&amp;amp;face=0_0_1020_885');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[2편]&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2024.09.11 - [개발자 모드/응용] - [CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[1편]&amp;nbsp;[CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[1편]평소 CI/CD에 대해서 관심은 있었지만 직접 경험해&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;precious-value.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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: #14141f; text-align: start;&quot;&gt;그리고 [ &lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;Branches to build] 탭에 &lt;/span&gt;배포를 할 브랜치를 선택해 주면 됨!!(필자는 master 브랜치임!!)&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;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcZz2q/btsJAWfqe1B/2TdcoMBznV4RilKGiKVjPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcZz2q/btsJAWfqe1B/2TdcoMBznV4RilKGiKVjPk/img.png&quot; data-alt=&quot;빌드 트리거 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcZz2q/btsJAWfqe1B/2TdcoMBznV4RilKGiKVjPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcZz2q%2FbtsJAWfqe1B%2F2TdcoMBznV4RilKGiKVjPk%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;507&quot; height=&quot;441&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;441&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;이후 [빌드 유발] 탭에서 [Build after other projects are built]를 선택 &amp;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: #14141f; text-align: start;&quot;&gt;필자는 CI Job이 끝난 이후에 CD Job을 진행해야 하기 때문에 이렇게 설정함!!&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;그리고 [Trigger only if build is stable]을 선택!!(빌드가 성공했을 때 CD를 진행하기 위해서 )&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;356&quot; data-origin-height=&quot;321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNctXU/btsJAT39itA/iKY5BAXZsZt8JxaYCgGw9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNctXU/btsJAT39itA/iKY5BAXZsZt8JxaYCgGw9K/img.png&quot; data-alt=&quot;빌드에 필요한 쉘 추가 화면 1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNctXU/btsJAT39itA/iKY5BAXZsZt8JxaYCgGw9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNctXU%2FbtsJAT39itA%2FiKY5BAXZsZt8JxaYCgGw9K%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;356&quot; height=&quot;321&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;356&quot; data-origin-height=&quot;321&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;빌드에 필요한 쉘 추가 화면 1&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;[Build Steps] &amp;gt; [Add build step]을 클릭 후 [Execute shell]을 선택!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOqQNS/btsJARSPt1R/mXwie3XKP6f0CihUKL9p61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOqQNS/btsJARSPt1R/mXwie3XKP6f0CihUKL9p61/img.png&quot; data-alt=&quot;빌드에 필요한 쉘 추가 화면 2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOqQNS/btsJARSPt1R/mXwie3XKP6f0CihUKL9p61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOqQNS%2FbtsJARSPt1R%2FmXwie3XKP6f0CihUKL9p61%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;1278&quot; height=&quot;472&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;빌드에 필요한 쉘 추가 화면 2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1726192516646&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ssh username@production-server-ip &amp;lt;&amp;lt; 'EOF'

cd ~/review-spot/review_spot_backend/		# 프로젝트 경로로 이동

git pull origin master	# 소스 코드 최신화

source venv/bin/activate	# 가상 환경 접속

pip install -r requirements.txt		# 라이브러리 최신화

python ./manage.py migrate	# 마이그레이션 진행

sudo systemctl restart gunicorn	# gunicorn 서버 재실행

sudo systemctl restart nginx	# nginx 서버 재실행

EOF&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;span style=&quot;color: #14141f;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;이 명령어는 어떤 백엔드 프레임워크를 쓰는지 환경이 어떤 지에 따라 달라진다는 것!!&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 style=&quot;color: #14141f;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;어려운 명령어는 없다고 생각함!!&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 style=&quot;color: #14141f;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt; ssh username@production-server-ip &amp;lt;&amp;lt; &lt;span&gt;'EOF' ~ EOF : 는 ssh를 통해 배포할 서버에 접속을 하고 ~ 안에 있는 명령어들을 한 번에 실행해 줌!!&lt;/span&gt;&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 style=&quot;color: #14141f;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span&gt;EOF(End Of&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #14141f;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span&gt;File)이라고 하며 이러한 방식을 히어 도큐먼트라고 부른다고 함!!&lt;/span&gt;&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 style=&quot;color: #14141f;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;각자의 환경에 맞게 커스텀한 쉘을 추가했다면 저장 버튼 클릭!!&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 style=&quot;color: #14141f;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;이제 배포가 잘되는지 테스트를 진행해 보고 에러가 났다면 젠킨스의 프로젝트&amp;gt; 콘솔에서 에러를 확인 후 수정하면 됨!!&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 style=&quot;color: #14141f;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;다음번에는 CI가 완료되면 도커 허브에 이미지를 올리고 도커 컴포즈로 이미지를 가져와 컨테이너를 띄워서 CD를 진행해 웹 서버를 구축하는 방법을 포스팅해보겠음!! &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;WhaleDockerGIF.gif&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQWwFa/btsJBqInx9j/u5G0k4XxEDqlOWZ8PXKZK0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQWwFa/btsJBqInx9j/u5G0k4XxEDqlOWZ8PXKZK0/img.gif&quot; data-alt=&quot;도커 이미지같은 영상&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQWwFa/btsJBqInx9j/u5G0k4XxEDqlOWZ8PXKZK0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cQWwFa/btsJBqInx9j/u5G0k4XxEDqlOWZ8PXKZK0/img.gif&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;179&quot; height=&quot;179&quot; data-filename=&quot;WhaleDockerGIF.gif&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;400&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #14141f;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;다들 고생하셨고, 추석 잘 보내시길!! &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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 모드/응용</category>
      <category>cd</category>
      <category>젠킨스</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/60</guid>
      <comments>https://precious-value.tistory.com/60#entry60comment</comments>
      <pubDate>Fri, 13 Sep 2024 15:26:19 +0900</pubDate>
    </item>
    <item>
      <title>[CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[3편]</title>
      <link>https://precious-value.tistory.com/59</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://precious-value.tistory.com/58&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.09.12 - [개발자 모드/응용] - [CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[2편]&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1726128160435&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[2편]&quot; data-og-description=&quot;2024.09.11 - [개발자 모드/응용] - [CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[1편]&amp;nbsp;[CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[1편]평소 CI/CD에 대해서 관심은 있었지만 직접 경험해 &quot; data-og-host=&quot;precious-value.tistory.com&quot; data-og-source-url=&quot;https://precious-value.tistory.com/58&quot; data-og-url=&quot;https://precious-value.tistory.com/58&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eMKPK/hyWZaSXv3o/4ARXekSbLexB5kU9cBsyLk/img.gif?width=498&amp;amp;height=498&amp;amp;face=149_154_270_286,https://scrap.kakaocdn.net/dn/76nSj/hyW2YDihtB/Tan9vsWEAycgfl2WgNCeMK/img.gif?width=498&amp;amp;height=498&amp;amp;face=149_154_270_286,https://scrap.kakaocdn.net/dn/bk0H0n/hyWZenul9X/WsInsqo1gxD6KctMyMKFt0/img.png?width=1020&amp;amp;height=885&amp;amp;face=0_0_1020_885&quot;&gt;&lt;a href=&quot;https://precious-value.tistory.com/58&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://precious-value.tistory.com/58&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eMKPK/hyWZaSXv3o/4ARXekSbLexB5kU9cBsyLk/img.gif?width=498&amp;amp;height=498&amp;amp;face=149_154_270_286,https://scrap.kakaocdn.net/dn/76nSj/hyW2YDihtB/Tan9vsWEAycgfl2WgNCeMK/img.gif?width=498&amp;amp;height=498&amp;amp;face=149_154_270_286,https://scrap.kakaocdn.net/dn/bk0H0n/hyWZenul9X/WsInsqo1gxD6KctMyMKFt0/img.png?width=1020&amp;amp;height=885&amp;amp;face=0_0_1020_885');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[2편]&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2024.09.11 - [개발자 모드/응용] - [CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[1편]&amp;nbsp;[CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[1편]평소 CI/CD에 대해서 관심은 있었지만 직접 경험해&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;precious-value.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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편에 이어서 이번 편에서는 젠킨스에 &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;빌드 및 테스트할 Job을 생성해서 CI를 마무리할 예정!!&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;&quot;&gt;그럼 바로 시작~~! &lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;[3편-1] Jenkins Job 설정&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;gt; 새로운 item 클릭!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;788&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wQ6lO/btsJzm0vTYk/ZjKbogKWjDf5sV9MjoXc10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wQ6lO/btsJzm0vTYk/ZjKbogKWjDf5sV9MjoXc10/img.png&quot; data-alt=&quot;새로운 job 추가 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wQ6lO/btsJzm0vTYk/ZjKbogKWjDf5sV9MjoXc10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwQ6lO%2FbtsJzm0vTYk%2FZjKbogKWjDf5sV9MjoXc10%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;538&quot; height=&quot;551&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;788&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;새로운 job 추가 화면&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;아이템 이름은 독자님들 원하시는 데로 설정하고 Freestyle project 선택 후 ok 버튼 클릭!!&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;이후 해당 job&amp;gt; 구성 설정에서 &lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;[소스 코드 관리]&lt;/b&gt;&lt;/span&gt; 탭을 Git 선택!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1301&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BQsaa/btsJzBwkLYa/eP4rQUxUpRLLU8cbWv1OVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BQsaa/btsJzBwkLYa/eP4rQUxUpRLLU8cbWv1OVK/img.png&quot; data-alt=&quot;소스 코드 관리 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BQsaa/btsJzBwkLYa/eP4rQUxUpRLLU8cbWv1OVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBQsaa%2FbtsJzBwkLYa%2FeP4rQUxUpRLLU8cbWv1OVK%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;1301&quot; height=&quot;662&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1301&quot; data-origin-height=&quot;662&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;p data-ke-size=&quot;size16&quot;&gt;Repository URL은 본인 깃 프로젝트 Url을 복사해서 넣으면 됨!!&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;color: #f89009;&quot;&gt;&lt;b&gt;[빌드 유발] &lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;탭 선택 &amp;gt; GitHub hook trigger for GITScm polling 체크!!&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 style=&quot;color: #f89009;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그리고 Build Steps &amp;gt; Add build step 클릭 &amp;gt; Execute shell 선택!!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;621&quot; data-origin-height=&quot;852&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CNeyI/btsJzzL23QE/rTNXNJBNTZqk4KR4ACwqpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CNeyI/btsJzzL23QE/rTNXNJBNTZqk4KR4ACwqpk/img.png&quot; data-alt=&quot;빌드 유발 설정 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CNeyI/btsJzzL23QE/rTNXNJBNTZqk4KR4ACwqpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCNeyI%2FbtsJzzL23QE%2FrTNXNJBNTZqk4KR4ACwqpk%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;621&quot; height=&quot;852&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;621&quot; data-origin-height=&quot;852&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;288&quot; data-origin-height=&quot;343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYO9PN/btsJAV753ky/3XDbvqTKHaD6q4YTGOxfe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYO9PN/btsJAV753ky/3XDbvqTKHaD6q4YTGOxfe0/img.png&quot; data-alt=&quot;커맨드 내용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYO9PN/btsJAV753ky/3XDbvqTKHaD6q4YTGOxfe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYO9PN%2FbtsJAV753ky%2F3XDbvqTKHaD6q4YTGOxfe0%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;288&quot; height=&quot;343&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;288&quot; data-origin-height=&quot;343&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;p data-ke-size=&quot;size16&quot;&gt;필자는 장고 프로젝트를 빌드 및 테스트를 해야 하기 때문에 위와 같이 커맨드를 작성 후 저장 버튼 클릭하면 새로운 Job이 만들어짐!!&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;⚠️[참고] : 젠킨스의 홈 디렉토리(/var/jenkins_home/) 안에 workspace라는 폴더가 있는데 이 디렉토리가 작업 디렉토리임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Eluq1/btsJCI8nQtf/KcXJxXMpHMIPC6nqKVI14K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Eluq1/btsJCI8nQtf/KcXJxXMpHMIPC6nqKVI14K/img.png&quot; data-alt=&quot;젠킨스 작업 공간 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Eluq1/btsJCI8nQtf/KcXJxXMpHMIPC6nqKVI14K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEluq1%2FbtsJCI8nQtf%2FKcXJxXMpHMIPC6nqKVI14K%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;763&quot; height=&quot;405&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;405&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;p data-ke-size=&quot;size16&quot;&gt;젠킨스 서버 좌측 메뉴 &amp;gt; 작업 공간에서도 확인할 수 있고, 실제 젠킨스 컨테이너의 /var/jenkins_home/workspace/에서도 확인할 수 있음!! &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;실제로 workspace 경로를 확인하면 내가 등록한 Job 또는 프로젝트마다 디렉토리가 존재하는 것을 볼 수 있음!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwLAh1/btsJAUJuAoJ/kfVwSsvtvK1VCHSC4XCyk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwLAh1/btsJAUJuAoJ/kfVwSsvtvK1VCHSC4XCyk1/img.png&quot; data-alt=&quot;젠킨스 서버 workspace 경로&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwLAh1/btsJAUJuAoJ/kfVwSsvtvK1VCHSC4XCyk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwLAh1%2FbtsJAUJuAoJ%2FkfVwSsvtvK1VCHSC4XCyk1%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;548&quot; height=&quot;199&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;젠킨스 서버 workspace 경로&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;만약 필자처럼 프로젝트명을 수정하면 수정한 만큼 폴더가 생성됨..(지워야지ㅎㅎ )&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;DeleteEraseGIF.gif&quot; data-origin-width=&quot;100&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOFCRL/btsJBmyWAQs/NITiAIN3uVrZBiltG1i4T0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOFCRL/btsJBmyWAQs/NITiAIN3uVrZBiltG1i4T0/img.gif&quot; data-alt=&quot;삭제버튼&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOFCRL/btsJBmyWAQs/NITiAIN3uVrZBiltG1i4T0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cOFCRL/btsJBmyWAQs/NITiAIN3uVrZBiltG1i4T0/img.gif&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;100&quot; height=&quot;96&quot; data-filename=&quot;DeleteEraseGIF.gif&quot; data-origin-width=&quot;100&quot; data-origin-height=&quot;96&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;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;blockquote data-ke-style=&quot;style3&quot;&gt;ex) 젠킨스 서버에서 jenkins-ci 프로젝트 생성 &amp;gt; 커맨드가 실행되는 디렉토리 : /var/jenkins_home/workspace/jenkins-ci/&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 생성하고 소스를 수정한 후 깃허브 master 브랜치에 push를 하면!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;310&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccXg2c/btsJzZDG1q6/VF7ztSNIJmz9f5IVIrzWfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccXg2c/btsJzZDG1q6/VF7ztSNIJmz9f5IVIrzWfK/img.png&quot; data-alt=&quot;젠킨스 서버 빌드 알림&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccXg2c/btsJzZDG1q6/VF7ztSNIJmz9f5IVIrzWfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccXg2c%2FbtsJzZDG1q6%2FVF7ztSNIJmz9f5IVIrzWfK%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;310&quot; height=&quot;219&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;310&quot; data-origin-height=&quot;219&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;왼쪽 아래에 빌드 알림이 뜬 것을 볼 수 있음!!&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를 클릭 후 좌측 메뉴에서 Console OutPut을 클릭하여 에러를 확인하면 됨!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;783&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caSFPt/btsJzO3tB0P/XaqLm8UVQKFaroig2Y8WN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caSFPt/btsJzO3tB0P/XaqLm8UVQKFaroig2Y8WN0/img.png&quot; data-alt=&quot;빌드 에러 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caSFPt/btsJzO3tB0P/XaqLm8UVQKFaroig2Y8WN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaSFPt%2FbtsJzO3tB0P%2FXaqLm8UVQKFaroig2Y8WN0%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;1684&quot; height=&quot;783&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;783&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;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;필자는 장고 프로젝트니까 빌드 및 테스트에 필요한 python3, pip 등 라이브러리를 설치하고 djago를 설치하기 위해 가상환경 세팅까지 진행해보려고 함!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;[3편-2] 젠킨스 컨테이너에 빌드 및 테스트 환경 세팅&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;pre id=&quot;code_1726131088880&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker exec -u 0 -it jenkins /bin/bash # 도커 컨테이너 접속 명령어&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1726131224189&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apt-get update -y # 패키지 업데이트 명령어
apt-get install -y python3 pip # 파이썬과 pip 설치 명령어&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;/var/jenkins_home/workspace/jenkins-ci/ 안에 장고 프로젝트 경로로 이동!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1726133344541&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python3 -m venv venv # 가상환경 설치 명령어&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;But!!!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJERB6/btsJzQNPl4S/NeQQrty17z0SMcDoOK8qs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJERB6/btsJzQNPl4S/NeQQrty17z0SMcDoOK8qs1/img.png&quot; data-alt=&quot;가상 환경 설치 시 볼 수 있는 메세지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJERB6/btsJzQNPl4S/NeQQrty17z0SMcDoOK8qs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJERB6%2FbtsJzQNPl4S%2FNeQQrty17z0SMcDoOK8qs1%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;801&quot; height=&quot;174&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;174&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;이 메세지는 파이썬 가상 환경을 만들려고 했을 때 ensurepip 모듈이 없어서 가상 환경이 성공적으로 생성되지 못했다고 알려주는 메세지임!!&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;⚠️[참고] : ensurepip은 파이썬 가상 환경 내에 pip을 자동으로 설치하는 데 사용되는 모듈&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;
&lt;pre id=&quot;code_1726133806212&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; apt install python3.11-venv&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;명령어로 python3.11-venv 설치 후 가상환경을 만들면 정상적으로 가상환경이 만들어짐!! &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;가상환경을 설치 후 주의해야 할 점이 있는데 root 계정으로 접속하여 가상환경을 설치했기 때문에 가상환경의 소유자가 root임!!&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;이 전편에서 ssh key를 발급할 때 root 계정으로 발급했다면 문제가 없지만 필자처럼 일반 사용자로 발급했다면 Permission denied라는 귀찮은 권한 문제를 겪을 수 있음.&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;그렇기 때문에 venv 폴더 소유자를 ssh key를 발급할 때 접속했던 계정으로 변경해줘야 함!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1726133590332&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;chown jenkins:jenkins -R  venv/ # 소유자 변경 명령어&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;venv 하위 디렉토리에 있는 폴더 모두 소유자를 변경해 줌!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D9tgL/btsJAyFJ19u/2z1L98i1J9OsKUk45KlJh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D9tgL/btsJAyFJ19u/2z1L98i1J9OsKUk45KlJh1/img.png&quot; data-alt=&quot;소유자를 변경 후 ls -al 명령어&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D9tgL/btsJAyFJ19u/2z1L98i1J9OsKUk45KlJh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD9tgL%2FbtsJAyFJ19u%2F2z1L98i1J9OsKUk45KlJh1%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;730&quot; height=&quot;226&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;소유자를 변경 후 ls -al 명령어&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;이제 가상환경과 소유자 변경까지 완료했다면 다시 젠킨스의 Job &amp;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;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccTLxQ/btsJARLCKp1/1xZGWDDiJyGO75LKMRKxf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccTLxQ/btsJARLCKp1/1xZGWDDiJyGO75LKMRKxf1/img.png&quot; data-alt=&quot;젠킨스의 빌드 커맨트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccTLxQ/btsJARLCKp1/1xZGWDDiJyGO75LKMRKxf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccTLxQ%2FbtsJARLCKp1%2F1xZGWDDiJyGO75LKMRKxf1%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;1278&quot; height=&quot;416&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;416&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;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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1726134146496&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash # 스크립트를 Bash 쉘로 명시적으로 실행
source ./review_spot_backend/venv/bin/activate # 가상환경 모드 ON
pip install -r ./review_spot_backend/requirements.txt # 라이브러리 의존성 설치
python ./review_spot_backend/manage.py makemigrations # 마이그레이션 파일 생성
python ./review_spot_backend/manage.py migrate # 마이그레이션 진행
python ./review_spot_backend/manage.py test # 테스트 시작&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;/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를 PostgreSQL을 사용 중이라면&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1726134261526&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apt-get install libpq-dev&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;명령어로 PostgreSQL 개발 패키지를 설치해야만 에러가 안남!! &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;이후 소스를 수정한 후 github master 브랜치에 push 하면...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZBx8a/btsJzQNQs29/rQKgCiYyixB2jk89SuRk30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZBx8a/btsJzQNQs29/rQKgCiYyixB2jk89SuRk30/img.png&quot; data-alt=&quot;젠킨스 push 알람 리스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZBx8a/btsJzQNQs29/rQKgCiYyixB2jk89SuRk30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZBx8a%2FbtsJzQNQs29%2FrQKgCiYyixB2jk89SuRk30%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;322&quot; height=&quot;458&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;젠킨스 push 알람 리스트&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;위와 같이(#7) 빌드 히스토리가 성공한 것을 확인할 수 있음!!!(&lt;s&gt;수많은 실패가 있었던 건 안비밀 &lt;/s&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;여기까지가 CI 과정이고 이후 4편에서는 CD 과정을 차근차근 진행해보겠음!!&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;MrBeanThumbsUpGIF.gif&quot; data-origin-width=&quot;224&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l7s3D/btsJASKxwFr/esjZE22Drl6DK5LMxL9P7K/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l7s3D/btsJASKxwFr/esjZE22Drl6DK5LMxL9P7K/img.gif&quot; data-alt=&quot;따봉&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l7s3D/btsJASKxwFr/esjZE22Drl6DK5LMxL9P7K/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/l7s3D/btsJASKxwFr/esjZE22Drl6DK5LMxL9P7K/img.gif&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;224&quot; height=&quot;224&quot; data-filename=&quot;MrBeanThumbsUpGIF.gif&quot; data-origin-width=&quot;224&quot; data-origin-height=&quot;224&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>
      <category>CI</category>
      <category>젠킨스</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/59</guid>
      <comments>https://precious-value.tistory.com/59#entry59comment</comments>
      <pubDate>Thu, 12 Sep 2024 18:49:32 +0900</pubDate>
    </item>
    <item>
      <title>[CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[2편]</title>
      <link>https://precious-value.tistory.com/58</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://precious-value.tistory.com/57&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.09.11 - [개발자 모드/응용] - [CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[1편]&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1726037183950&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[1편]&quot; data-og-description=&quot;평소 CI/CD에 대해서 관심은 있었지만 직접 경험해 보기에는 어려울 듯하여 미루고 미루다 더 이상은 안 되겠다!! 싶어서 쓰는 젠킨스 서버 설치 포스팅!! &amp;nbsp;  ️세팅 환경&amp;nbsp;- 클라우드 서비스 :&quot; data-og-host=&quot;precious-value.tistory.com&quot; data-og-source-url=&quot;https://precious-value.tistory.com/57&quot; data-og-url=&quot;https://precious-value.tistory.com/57&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/psMnr/hyWZakXQGY/Z6wTcJdUhkGeYDbbv5eoa0/img.gif?width=358&amp;amp;height=344&amp;amp;face=119_69_228_188,https://scrap.kakaocdn.net/dn/WAOZj/hyWZhqR45N/lGv59A2YVSGMY9iIakCS40/img.gif?width=358&amp;amp;height=344&amp;amp;face=119_69_228_188,https://scrap.kakaocdn.net/dn/dR7sRi/hyW2ThxwLv/4YyeJPMowry3dcnUxYNkI1/img.jpg?width=2560&amp;amp;height=2560&amp;amp;face=0_0_2560_2560&quot;&gt;&lt;a href=&quot;https://precious-value.tistory.com/57&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://precious-value.tistory.com/57&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/psMnr/hyWZakXQGY/Z6wTcJdUhkGeYDbbv5eoa0/img.gif?width=358&amp;amp;height=344&amp;amp;face=119_69_228_188,https://scrap.kakaocdn.net/dn/WAOZj/hyWZhqR45N/lGv59A2YVSGMY9iIakCS40/img.gif?width=358&amp;amp;height=344&amp;amp;face=119_69_228_188,https://scrap.kakaocdn.net/dn/dR7sRi/hyW2ThxwLv/4YyeJPMowry3dcnUxYNkI1/img.jpg?width=2560&amp;amp;height=2560&amp;amp;face=0_0_2560_2560');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[1편]&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;평소 CI/CD에 대해서 관심은 있었지만 직접 경험해 보기에는 어려울 듯하여 미루고 미루다 더 이상은 안 되겠다!! 싶어서 쓰는 젠킨스 서버 설치 포스팅!! &amp;nbsp;  ️세팅 환경&amp;nbsp;- 클라우드 서비스 :&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;precious-value.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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: #333333; text-align: start;&quot;&gt;(키 등록, 웹훅 설정 등)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&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;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;[2편-1] 젠킨스 초기 설정&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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편에서 생성한 도커의 젠킨스 컨테이너를 실행시킨 뒤 서버에 접속!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;887&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bD79wc/btsJy3yHxJG/DsEWtbkhnvkfgXMmak6ax0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bD79wc/btsJy3yHxJG/DsEWtbkhnvkfgXMmak6ax0/img.png&quot; data-alt=&quot;젠킨스 패스워드 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bD79wc/btsJy3yHxJG/DsEWtbkhnvkfgXMmak6ax0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbD79wc%2FbtsJy3yHxJG%2FDsEWtbkhnvkfgXMmak6ax0%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;536&quot; height=&quot;454&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;887&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;접속하니 웬 패스워드를 치라고 하는데... 난 패스워드를 설정한 적이 없는데!!? &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;나와있는 데로 &lt;span style=&quot;background-color: #f9f2f4; color: #c7254e; text-align: start;&quot;&gt;/var/jenkins_home/secrets/initialAdminPassword&lt;span style=&quot;background-color: #ffffff; color: #333333;&quot;&gt; 해당 경로에 가면 패스워드를 알 수 있음!&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 style=&quot;background-color: #f9f2f4; color: #c7254e; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333;&quot;&gt;또는&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1726038022337&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker logs 컨테이너명&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;span style=&quot;background-color: #f9f2f4; color: #c7254e; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333;&quot;&gt;을 하면&amp;nbsp; 해당 컨테이너의 로그에 비밀번호가 나와있음!!&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f9f2f4; color: #c7254e; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f9f2f4; color: #c7254e; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIofjN/btsJzSKN353/KUOOoZS2hbA8iqzbE4VQ90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIofjN/btsJzSKN353/KUOOoZS2hbA8iqzbE4VQ90/img.png&quot; data-alt=&quot;젠킨스 서버 비밀번호&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIofjN/btsJzSKN353/KUOOoZS2hbA8iqzbE4VQ90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIofjN%2FbtsJzSKN353%2FKUOOoZS2hbA8iqzbE4VQ90%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;609&quot; height=&quot;219&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;219&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;이 패스워드를 입력하면!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1009&quot; data-origin-height=&quot;887&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uNW3I/btsJx5jHIlk/uAuzb4mhVQL1BLsj2UeR5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uNW3I/btsJx5jHIlk/uAuzb4mhVQL1BLsj2UeR5k/img.png&quot; data-alt=&quot;인스톨 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uNW3I/btsJx5jHIlk/uAuzb4mhVQL1BLsj2UeR5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuNW3I%2FbtsJx5jHIlk%2FuAuzb4mhVQL1BLsj2UeR5k%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;522&quot; height=&quot;459&quot; data-origin-width=&quot;1009&quot; data-origin-height=&quot;887&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;p data-ke-size=&quot;size16&quot;&gt;인스톨 화면으로 넘어오고, Install suggested plugins 클릭!! &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1036&quot; data-origin-height=&quot;886&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi026y/btsJzzXU42W/csEkXB3XNzn7sdgVXvpTt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi026y/btsJzzXU42W/csEkXB3XNzn7sdgVXvpTt0/img.png&quot; data-alt=&quot;설치 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi026y/btsJzzXU42W/csEkXB3XNzn7sdgVXvpTt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi026y%2FbtsJzzXU42W%2FcsEkXB3XNzn7sdgVXvpTt0%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;544&quot; height=&quot;465&quot; data-origin-width=&quot;1036&quot; data-origin-height=&quot;886&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;그러면 알아서 설치를 진행해 줌!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;885&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wnd0u/btsJyHvScEu/JKd8WmNImyLQzT4l7h99NK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wnd0u/btsJyHvScEu/JKd8WmNImyLQzT4l7h99NK/img.png&quot; data-alt=&quot;첫 관리자 계정 생성 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wnd0u/btsJyHvScEu/JKd8WmNImyLQzT4l7h99NK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwnd0u%2FbtsJyHvScEu%2FJKd8WmNImyLQzT4l7h99NK%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;565&quot; height=&quot;490&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;885&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;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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;887&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpKN1n/btsJzUaMiuC/XmhHHKeTTB7P089m1jUYVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpKN1n/btsJzUaMiuC/XmhHHKeTTB7P089m1jUYVK/img.png&quot; data-alt=&quot;젠킨스 접속 URL 설정 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpKN1n/btsJzUaMiuC/XmhHHKeTTB7P089m1jUYVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpKN1n%2FbtsJzUaMiuC%2FXmhHHKeTTB7P089m1jUYVK%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;498&quot; height=&quot;434&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;887&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;젠킨스 접속 URL 설정 화면&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;젠킨스 url은 자동으로 입력되어 있어서 Save and Finish를 클릭!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;886&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/emNdVD/btsJzaYC2WP/kwYQl57MsnTwzmlu7lkHX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/emNdVD/btsJzaYC2WP/kwYQl57MsnTwzmlu7lkHX0/img.png&quot; data-alt=&quot;준비완료된 젠킨스 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/emNdVD/btsJzaYC2WP/kwYQl57MsnTwzmlu7lkHX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FemNdVD%2FbtsJzaYC2WP%2FkwYQl57MsnTwzmlu7lkHX0%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;523&quot; height=&quot;452&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;886&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;p data-ke-size=&quot;size16&quot;&gt;Start using Jenkins 클릭하면 젠킨스 초기 설정은 끝!! &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;[2편-2] 깃헙과 젠킨스 연동 작업&lt;span style=&quot;background-color: #ffffff; color: #8a3db6; text-align: start;&quot;&gt;(키 등록, 웹훅 설정 등) - 젠킨스 ssh key 생성 후 개인 키 등록&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 깃헙에서 특정 브랜치에 push 했을 때 젠킨스에서 빌드 및 테스트가 가능하도록 연결 작업을 진행해 보겠음!!&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;먼저 젠킨스에서 SSH key를 생성해야 함.&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;젠킨스 컨테이너의 shell에 접속하고 아래 명령어대로 키 생성 진행!&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;⚠️[참고] jenkins의 홈 폴더 경로 : /var/jenkins_home/&lt;/p&gt;
&lt;pre id=&quot;code_1726122336033&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# .ssh 폴더 생성 후 이동
mkdir /var/jenkins_home/.ssh
cd ./.ssh

# ssh 키 생성
ssh-keygen -t rsa -f /var/jenkins_home/.ssh/jenkins_ssh_key&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQvEqo/btsJATvqMre/EG1uOk13Sjckg8878tljhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQvEqo/btsJATvqMre/EG1uOk13Sjckg8878tljhk/img.png&quot; data-alt=&quot;ssh key 발급 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQvEqo/btsJATvqMre/EG1uOk13Sjckg8878tljhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQvEqo%2FbtsJATvqMre%2FEG1uOk13Sjckg8878tljhk%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;568&quot; height=&quot;406&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ssh key 발급 과정&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;공개키를 발급받을 때 입력하는 게 있지만 그냥 엔터치고 진행!!&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;jenkins_ssh_key : 개인 키(&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;젠킨스에 등록&lt;/b&gt;&lt;/span&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jenkins_ssh_key.pub : 공개 키(&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;깃헙에 등록&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1387&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vZOuV/btsJA8sfffS/gKbTWtCMkyPGknwgRiCBUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vZOuV/btsJA8sfffS/gKbTWtCMkyPGknwgRiCBUk/img.png&quot; data-alt=&quot;젠킨스 키 설정 화면 1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vZOuV/btsJA8sfffS/gKbTWtCMkyPGknwgRiCBUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvZOuV%2FbtsJA8sfffS%2FgKbTWtCMkyPGknwgRiCBUk%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;795&quot; height=&quot;381&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1387&quot; data-origin-height=&quot;664&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;젠킨스 키 설정 화면 1&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;Kenkins 관리 &amp;gt; Credentials 클릭!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1902&quot; data-origin-height=&quot;772&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9xoAO/btsJzbkmcS8/HqoCo9hjx81E59K2hN9Tl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9xoAO/btsJzbkmcS8/HqoCo9hjx81E59K2hN9Tl1/img.png&quot; data-alt=&quot;젠킨스 키 설정 화면 2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9xoAO/btsJzbkmcS8/HqoCo9hjx81E59K2hN9Tl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9xoAO%2FbtsJzbkmcS8%2FHqoCo9hjx81E59K2hN9Tl1%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;919&quot; height=&quot;373&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1902&quot; data-origin-height=&quot;772&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;젠킨스 키 설정 화면 2&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;&lt;span style=&quot;color: #006dd7;&quot;&gt;(global) &lt;span style=&quot;color: #333333;&quot;&gt;위치에 마우스를 올리고 Add credentials 버튼 클릭!!&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1669&quot; data-origin-height=&quot;772&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZEkha/btsJzDt193K/7ylz5pYvujAludEW9x3TEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZEkha/btsJzDt193K/7ylz5pYvujAludEW9x3TEk/img.png&quot; data-alt=&quot;젠킨스 키 설정 화면 3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZEkha/btsJzDt193K/7ylz5pYvujAludEW9x3TEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZEkha%2FbtsJzDt193K%2F7ylz5pYvujAludEW9x3TEk%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;1669&quot; height=&quot;772&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1669&quot; data-origin-height=&quot;772&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;젠킨스 키 설정 화면 3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kind 옵션 &amp;gt; SSH Username with private key 선택 후 Private Key 옵션에 Enter directly 옵션 체크!!&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;이후 아까 jenkins_ssh_key(공개키)를 내용에 입력 후 Create 버튼 클릭!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1723&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBspjy/btsJARqY1wl/kkTjldgUi1JPjyaMpetqcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBspjy/btsJARqY1wl/kkTjldgUi1JPjyaMpetqcK/img.png&quot; data-alt=&quot;젠킨스 키 등록 완료 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBspjy/btsJARqY1wl/kkTjldgUi1JPjyaMpetqcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBspjy%2FbtsJARqY1wl%2FkkTjldgUi1JPjyaMpetqcK%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;1723&quot; height=&quot;267&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1723&quot; data-origin-height=&quot;267&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;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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;[2편-2] 깃헙과 젠킨스 연동 작업(키 등록, 웹훅 설정 등) - 깃헙에 공개 키 등록&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 생성한 /var/jenkins/. ssh/ 위치에 공개키(jenkins_ssh_key.pub)의 내용을 cat 명령어로 확인 후 복사!!&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;이후 연결할 깃헙 레포지토리에 접속 후 오른쪽의 Settings 버튼 클릭!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1521&quot; data-origin-height=&quot;782&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yBGwb/btsJAU8Yvoj/7HTrs5avfrZTdkWkC8YF20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yBGwb/btsJAU8Yvoj/7HTrs5avfrZTdkWkC8YF20/img.png&quot; data-alt=&quot;깃헙 공개키 등록 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yBGwb/btsJAU8Yvoj/7HTrs5avfrZTdkWkC8YF20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyBGwb%2FbtsJAU8Yvoj%2F7HTrs5avfrZTdkWkC8YF20%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;1521&quot; height=&quot;782&quot; data-origin-width=&quot;1521&quot; data-origin-height=&quot;782&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;p data-ke-size=&quot;size16&quot;&gt;이후 왼쪽 메뉴에서 Deploy keys &amp;gt; 우측 상단 Add deploy key 클릭!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;209&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVzTy6/btsJzRevItk/QKqvo9mQ4Q6clzT4NHVuo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVzTy6/btsJzRevItk/QKqvo9mQ4Q6clzT4NHVuo1/img.png&quot; data-alt=&quot;깃헙 공개키 등록 완료 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVzTy6/btsJzRevItk/QKqvo9mQ4Q6clzT4NHVuo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVzTy6%2FbtsJzRevItk%2FQKqvo9mQ4Q6clzT4NHVuo1%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;792&quot; height=&quot;202&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;209&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;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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;[2편-2] 깃헙과 젠킨스 연동 작업(키 등록, 웹훅 설정 등) - 깃헙 웹 훅 설정&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 깃헙 특정 브랜치에 소스 코드를 push 했을 때 Jenkins에 알림이 가도록 설정할 예정!!&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;Jenkins에는 github plugin이 기본적으로 설치가 되어 있기 때문에 깃헙에서만 설정을 해주면 됨!!&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;843&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4J4MT/btsJAhqmCqX/KSK0Llc19a0npO4I82xLMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4J4MT/btsJAhqmCqX/KSK0Llc19a0npO4I82xLMK/img.png&quot; data-alt=&quot;깃헙 웹훅 설정 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4J4MT/btsJAhqmCqX/KSK0Llc19a0npO4I82xLMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4J4MT%2FbtsJAhqmCqX%2FKSK0Llc19a0npO4I82xLMK%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;1460&quot; height=&quot;843&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;843&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;p data-ke-size=&quot;size16&quot;&gt;먼저 아까처럼 연결하고 싶은 레포지토리 Settings &amp;gt; 왼쪽 메뉴 Webhooks를 선택 후 Add webhook 버튼 클릭!!&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;이후 Payload URL에 뭘 넣을지는 다들 알겠죠?? &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;SuperJunior슈퍼주니어GIF (2).gif&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGzpza/btsJzC2Z7UZ/jqraoe4z7pvgf33M9YQWoK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGzpza/btsJzC2Z7UZ/jqraoe4z7pvgf33M9YQWoK/img.gif&quot; data-alt=&quot;알잖아요?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGzpza/btsJzC2Z7UZ/jqraoe4z7pvgf33M9YQWoK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cGzpza/btsJzC2Z7UZ/jqraoe4z7pvgf33M9YQWoK/img.gif&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;291&quot; height=&quot;498&quot; data-filename=&quot;SuperJunior슈퍼주니어GIF (2).gif&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;498&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;p data-ke-size=&quot;size16&quot;&gt;[jenkins의 주소:port]/github-webhook/을 입력 후 바로 Add webhook 버튼 클릭하면 설정이 완료됨!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbNkP0/btsJz4dD8ST/dTafq5EFDRkNN2Wfir8Gr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbNkP0/btsJz4dD8ST/dTafq5EFDRkNN2Wfir8Gr0/img.png&quot; data-alt=&quot;깃헙 웹 훅 등록 완료 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbNkP0/btsJz4dD8ST/dTafq5EFDRkNN2Wfir8Gr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbNkP0%2FbtsJz4dD8ST%2FdTafq5EFDRkNN2Wfir8Gr0%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;804&quot; height=&quot;224&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;224&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;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;이후 3편에서는... 젠킨스에서 깃헙에 push 된 소스 코드를 빌드 및 테스트할 Job을 생성해 볼 예정!!&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;그럼 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;&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;a href=&quot;https://www.dongyeon1201.kr/9026133b-31be-4b58-bcc7-49abbe893044#d64d5c63-a21a-446d-b2be-8a7f8dbae40f&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.dongyeon1201.kr/9026133b-31be-4b58-bcc7-49abbe893044#d64d5c63-a21a-446d-b2be-8a7f8dbae40f&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1726127679185&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Jenkins를 사용한 DevOps 환경 구축&quot; data-og-description=&quot;✅ 목차&quot; data-og-host=&quot;www.dongyeon1201.kr&quot; data-og-source-url=&quot;https://www.dongyeon1201.kr/9026133b-31be-4b58-bcc7-49abbe893044#d64d5c63-a21a-446d-b2be-8a7f8dbae40f&quot; data-og-url=&quot;https://www.dongyeon1201.kr/9026133b-31be-4b58-bcc7-49abbe893044&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cPpY9d/hyW2TBZ9Xy/tc62UjqKYMhJoKExO7CJQ0/img.png?width=2048&amp;amp;height=818&amp;amp;face=0_0_2048_818,https://scrap.kakaocdn.net/dn/BVtGo/hyW2VNkgSU/P4cn3BCh1LvERnDbvDibpK/img.png?width=2048&amp;amp;height=818&amp;amp;face=0_0_2048_818,https://scrap.kakaocdn.net/dn/bW1dan/hyWZjvydjT/pdj1Gq1o8jEzlXK0rP1Z41/img.png?width=1318&amp;amp;height=838&amp;amp;face=0_0_1318_838&quot;&gt;&lt;a href=&quot;https://www.dongyeon1201.kr/9026133b-31be-4b58-bcc7-49abbe893044#d64d5c63-a21a-446d-b2be-8a7f8dbae40f&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.dongyeon1201.kr/9026133b-31be-4b58-bcc7-49abbe893044#d64d5c63-a21a-446d-b2be-8a7f8dbae40f&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cPpY9d/hyW2TBZ9Xy/tc62UjqKYMhJoKExO7CJQ0/img.png?width=2048&amp;amp;height=818&amp;amp;face=0_0_2048_818,https://scrap.kakaocdn.net/dn/BVtGo/hyW2VNkgSU/P4cn3BCh1LvERnDbvDibpK/img.png?width=2048&amp;amp;height=818&amp;amp;face=0_0_2048_818,https://scrap.kakaocdn.net/dn/bW1dan/hyWZjvydjT/pdj1Gq1o8jEzlXK0rP1Z41/img.png?width=1318&amp;amp;height=838&amp;amp;face=0_0_1318_838');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Jenkins를 사용한 DevOps 환경 구축&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;✅ 목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.dongyeon1201.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 모드/응용</category>
      <category>CI</category>
      <category>깃헙</category>
      <category>연동</category>
      <category>젠킨스</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/58</guid>
      <comments>https://precious-value.tistory.com/58#entry58comment</comments>
      <pubDate>Thu, 12 Sep 2024 16:55:35 +0900</pubDate>
    </item>
    <item>
      <title>[CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[1편]</title>
      <link>https://precious-value.tistory.com/57</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;평소 CI/CD에 대해서 관심은 있었지만 직접 경험해 보기에는 어려울 듯하여 미루고 미루다 더 이상은 안 되겠다!! 싶어서 쓰는 젠킨스 서버 설치 포스팅!! &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;  ️세팅 환경&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;- 클라우드 서비스 : Google Cloud Platform(GCP)&lt;br /&gt;&amp;nbsp;- 클라우드 서버(젠킨스 서버) os : ubuntu 20.04 LTS&amp;nbsp;&lt;br /&gt;&amp;nbsp;- 클라우드 서버(장고 어플리케이션 서버) os : unbuntu 20.04 LTS&lt;br /&gt;&amp;nbsp;- 장고 웹 서버 구조&amp;nbsp; : Nginx + Gunicorn + Django Framwork&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 GCP를 사용해 VM 인스턴스 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;그리고 장고 웹 서버 환경은 도커 컨테이너를 사용하지 않고 직접 설치하였고, 깃 레포지토리 master 브랜치에 소스를 push 한 뒤 운영 중인 서버에서 git pull을 통해 소스를 최신화하는 방식으로 배포를 진행하고 있음.(반자동 배포)&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;그렇기 때문에 CI(&lt;span style=&quot;background-color: #ffffff; color: #9d9d9d; text-align: left;&quot;&gt;Continuous Integration&lt;/span&gt;)가 완료되었을 때 젠킨스 서버에 등록한 Job을 실행시켜 CD(&lt;span style=&quot;background-color: #ffffff; color: #9d9d9d; text-align: left;&quot;&gt;Continuous Deployment&lt;span style=&quot;color: #333333;&quot;&gt;)를 진행하려고 함!!&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 style=&quot;background-color: #ffffff; color: #9d9d9d; text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;추후에는 CI가 완료되면 도커 이미지를 만들어 도커 허브에 push 하고 도커 컴포즈를 사용해 장고 웹 서버 환경을 만들어보겠음!! &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;/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;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. 깃헙과 젠킨스 서버 연동 작업(키 등록, 웹훅 설정 등)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 젠킨스 서버에 빌드 및 테스트 환경 설정(python, pip 설치 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. CI가 완료되었을 때 실행할 젠킨스 Job 등록(배포할 때 사용할 명령어)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. CI/CD 테스트&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;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;[1편] 도커 설치 과정&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1726032224628&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get update # 슈퍼유저 권한으로 패키지 목록 업데이트&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1726032289953&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;apt-transport-https : HTTPS를 통해 패키지를 다운로드할 수 있도록 해줌&lt;/li&gt;
&lt;li&gt;ca-certificates : SSL/TLS 인증서를 검증하는데 필요한 인증서 패키지&lt;/li&gt;
&lt;li&gt;curl : CLI에서 데이터를 전송할 수 있는 도구&lt;/li&gt;
&lt;li&gt;software-properties-common : 소프트웨어 패키지를 관리하기 위한 스크립트 모음&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1726032413481&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;curl -fsSL : URL에서 데이터를 다운로드함. 이 옵션들은 에러를 출력하지 않고 리다이렉트 된 위치로 자동으로 이동하도록 하는 설정&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://download.docker.com/linux/ubuntu/gpg&quot;&gt;https://download.docker.com/linux/ubuntu/gpg&lt;/a&gt; : 도커의 공식 GPG 키&lt;/li&gt;
&lt;li&gt;sudo apt-key add - : 다운로드한 키를 시스템의 APT 키 목록에 추가&lt;/li&gt;
&lt;/ul&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;pre id=&quot;code_1726032970614&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo add-apt-repository &quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;add-apt-repository : 새로운 소프트웨어 레포지토리를 시스템에 추가&lt;/li&gt;
&lt;li&gt;deb [arch=amd64] &lt;a href=&quot;https://download.docker.com/linux/ubuntu&quot;&gt;https://download.docker.com/linux/ubuntu&lt;/a&gt; $(lsb_release -cs) stable : 도커의 레포지토리
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;lsb_release -cs : 현재 운영체제의 코드네임 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;pre id=&quot;code_1726033399485&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get update # 다시 패키지 목록 업데이트
sudo apt-get install -y docker-ce docker-ce-cli containerd.io # 도커 관련 패키지 설치&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;docker-ce : 도커 커뮤니티 에디션 패키지 설치
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;도커 자체의 핵심 실행 환경을 제공함&lt;/li&gt;
&lt;li&gt;컨테이너를 생성하고 관리하는데 필요한 모든 기능을 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;docker-ce-cli : 도커 커뮤니티 에디션 CLI 도구 설치
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;도커의 명령줄 인터페이스(CLI)를 제공&lt;/li&gt;
&lt;li&gt;docker run, docker build 등의 명령을 실행할 수 있는 도구가 포함&lt;/li&gt;
&lt;li&gt;docker-ce 핵심 서비스와 통신하여 다양한 작업 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;containerd.io : 컨테이너 런타임
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;도커 엔진에서 사용하는 컨테이너 런타임&lt;/li&gt;
&lt;li&gt;컨테이너 생명 주기를 관리하는 저수준의 컨테이너 런타임으로, 컨테이너 실행, 중지, 삭제 등의 작업을 담당함&lt;/li&gt;
&lt;li&gt;도커가 아닌 다른 환경에서도 사용될 수 있는 독립적인 구성 요소&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;But!! 도커 명령어를 사용할 때마다 sudo를 사용해 슈퍼 유저의 권한을 사용해야 함.&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;sudo 없이 도커 명령어를 사용하려면 도커 그룹에 지금 사용자를 추가해서 그룹 권한을 적용해야 함.&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;CheckListBjNovakGIF.gif&quot; data-origin-width=&quot;358&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k3Vld/btsJzfZR4H9/n8EnjPFRiSNSbhYglRXOq1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k3Vld/btsJzfZR4H9/n8EnjPFRiSNSbhYglRXOq1/img.gif&quot; data-alt=&quot;체크하는 영상&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k3Vld/btsJzfZR4H9/n8EnjPFRiSNSbhYglRXOq1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/k3Vld/btsJzfZR4H9/n8EnjPFRiSNSbhYglRXOq1/img.gif&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;219&quot; height=&quot;344&quot; data-filename=&quot;CheckListBjNovakGIF.gif&quot; data-origin-width=&quot;358&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;체크하는 영상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1726035075709&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;getent group docker # docker 그룹이 있는지 조회&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1726035135198&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo usermod -aG 그룹명 사용자명 # 해당 그룹에 사용자 추가 명령어&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;필자는 그룹명에 docker, 사용자명에 user 이런 식으로 추가함.&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;그리고 도커 명령어를 사용해 보면...?? 안됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1726035206020&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;newgrp docker&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;위 명령어로 현재 세션에서 docker 그룹 권한을 적용해야 사용이 가능함!!&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;이제 sudo 명령어 없이 자유롭게 docker 명령어 가능함.&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;pre id=&quot;code_1726035817357&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run -d -p 8080:8080 -p 50000:50000 --name jenkins --restart=always -v /home/ubuntu/jenkins_home:/var/jenkins_home jenkins/jenkins:lts&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-d : 백그라운드 모드로 컨테이너를 실행&lt;/li&gt;
&lt;li&gt;-p 8080:8080, -p 50000:50000 : 호스트와 컨테이너 간의 포트 매핑 설정으로, 8080은 웹 인터페이스, 50000은 젠킨스 슬레이브 연결용임&lt;/li&gt;
&lt;li&gt;--name jenkins : 컨테이너명&lt;/li&gt;
&lt;li&gt;--restart=always : 도커 데몬이 재시작될 때마다 컨테이너가 자동으로 재시작되도록 설정&lt;/li&gt;
&lt;li&gt;-v /home/ubuntu/jenkins_home:/var/jenkins_home : 데이터 볼륨을 호스트의 경로와 컨테이너의 경로에 마운트 하여 데이터를 영구적으로 저장(호스트 경로는 필자가 임의로 정함 )&lt;/li&gt;
&lt;li&gt;jenkins/jenkins:lts : 사용할 젠킨스 이미지로, LTS 버전을 사용(LTS 버전이 장기적으로 좋음)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어를 실행한다면 도커가 jenkins 이미지를 pull 해서 그 이미지를 가지고 컨테이너를 실행시킴.&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;이후 docker ps을 cli에 입력하면!!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1539&quot; data-origin-height=&quot;30&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brxLHB/btsJzgkdvrZ/1LownMq78psKOkPA5L9Sn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brxLHB/btsJzgkdvrZ/1LownMq78psKOkPA5L9Sn1/img.png&quot; data-alt=&quot;실행중인 컨테이너 목록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brxLHB/btsJzgkdvrZ/1LownMq78psKOkPA5L9Sn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrxLHB%2FbtsJzgkdvrZ%2F1LownMq78psKOkPA5L9Sn1%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;3592&quot; height=&quot;70&quot; data-origin-width=&quot;1539&quot; data-origin-height=&quot;30&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;p data-ke-size=&quot;size16&quot;&gt;그리고 웹 브라우저에서 http://[your-vm-ip]:8080으로 접속하여 젠킨스 설정을 하면 되는데...&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;혹시 접속이 되지 않는다면 방화벽 설정을 하고 진행해야 함!!!(필자는 이미 8080 포트는 열어서 설정은 생략하겠음)&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;aws나 gcp 둘 다 방화벽 설정하는 방법을 참고!!&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편에서 젠킨스 설정 및 CI/CD 파이프 라인 설정을 진행해 보겠음!! 다들 고생하셨음!! &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편에서 봐요~~ &lt;/p&gt;</description>
      <category>개발자 모드/응용</category>
      <category>CI/CD</category>
      <category>Docker</category>
      <category>Jenkins</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/57</guid>
      <comments>https://precious-value.tistory.com/57#entry57comment</comments>
      <pubDate>Wed, 11 Sep 2024 15:43:19 +0900</pubDate>
    </item>
    <item>
      <title>[후기] 개발 인생 첫 해커톤 참가(feat. 최우수상 )</title>
      <link>https://precious-value.tistory.com/56</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;  평소 나는 '회사에서 맡은 업무만 열심히 하면 되지 뭐~'라는 생각을 가지고 살아가고 있었는데, 그것은 우물 안 개구리 마인드였던 것... 루즈해진 개발자 인생에 신선한 공기를 불어넣어 버린 좌충우돌 해커톤 참가 후기(2024. 08. 03 ~ 2024. 08. 14) &lt;/blockquote&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: #fcfcfc; color: #666666; text-align: left;&quot;&gt;ℹ️프로젝트 깃헙 url&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;- &lt;/span&gt;&lt;a style=&quot;color: #0070d1; text-align: left;&quot; href=&quot;https://github.com/crython-guardians/crython-client&quot;&gt;Frontend&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1725867231750&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - crython-guardians/crython-client&quot; data-og-description=&quot;Contribute to crython-guardians/crython-client development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/crython-guardians/crython-client&quot; data-og-url=&quot;https://github.com/crython-guardians/crython-client&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bk6tZb/hyW2SQbggj/HhPnN5KvFnZTBNLKMgFZgK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/crython-guardians/crython-client&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/crython-guardians/crython-client&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bk6tZb/hyW2SQbggj/HhPnN5KvFnZTBNLKMgFZgK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - crython-guardians/crython-client&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to crython-guardians/crython-client development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1; text-align: left;&quot; href=&quot;https://github.com/crython-guardians/crython-server&quot;&gt;Backend&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1725867236748&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - crython-guardians/crython-server&quot; data-og-description=&quot;Contribute to crython-guardians/crython-server development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/crython-guardians/crython-server&quot; data-og-url=&quot;https://github.com/crython-guardians/crython-server&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/KGfV9/hyWZnddVjr/WJh9yzARAdH5Skc9u0tg5K/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/crython-guardians/crython-server&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/crython-guardians/crython-server&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/KGfV9/hyWZnddVjr/WJh9yzARAdH5Skc9u0tg5K/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - crython-guardians/crython-server&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to crython-guardians/crython-server development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;89bdd190-3355-11ef-9a01-2b972ba84d20.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;1120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WPjfj/btsJuCIraeA/H1GyR0KiehkXnS4gACdJOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WPjfj/btsJuCIraeA/H1GyR0KiehkXnS4gACdJOK/img.png&quot; data-alt=&quot;해커톤 정보 이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WPjfj/btsJuCIraeA/H1GyR0KiehkXnS4gACdJOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWPjfj%2FbtsJuCIraeA%2FH1GyR0KiehkXnS4gACdJOK%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;366&quot; height=&quot;514&quot; data-filename=&quot;89bdd190-3355-11ef-9a01-2b972ba84d20.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;1120&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;때는 바야흐로 7월경... 회사에서 진행하는 업무가 많지않아 혼자 공부하는 것도 지치던 중 해커톤을 참가하면 새로운 경험을 통해 한층 더 성장할 수 있지 않을까 해서 공모전을 찾기 시작함.&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;나처럼 솔플하는 사람들은 팀을 랜덤으로 배정해 주고 8월 3일부터 8월 13일까지 온라인으로 개발을 진행해서 8월 14일 파이널 데이에 발표하여 심사를 받는 일정이었음!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;UturnIturnGIF (2).gif&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhM9kt/btsJualrcaP/55X8fxwGTnuKVK8Sk6PQaK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhM9kt/btsJualrcaP/55X8fxwGTnuKVK8Sk6PQaK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhM9kt/btsJualrcaP/55X8fxwGTnuKVK8Sk6PQaK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bhM9kt/btsJualrcaP/55X8fxwGTnuKVK8Sk6PQaK/img.gif&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;331&quot; height=&quot;266&quot; data-filename=&quot;UturnIturnGIF (2).gif&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;266&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;span style=&quot;background-color: #f7f7f7; color: #444444; text-align: start;&quot;&gt;PM, UX/UI디자인, 개발으로&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;/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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 신청할 때 주제 1 MVP 개발, 주제 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;&quot;기왕 하는 거 끝을 봐야지!&quot;라는 생각과 더 많이 얻어가고 싶은 욕심에 MVP 개발을 신청하였음!!&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;8월 3일 킥오프 전까지 간단한 자기소개를 제출하고 킥오프 당일날 주제 선택 및 팀 배정을 받음 &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;제목 없음.png&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;735&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/84ubM/btsJuWtEOgS/yK2KfKkHkM5P6wkpagtnY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/84ubM/btsJuWtEOgS/yK2KfKkHkM5P6wkpagtnY0/img.png&quot; data-alt=&quot;주제1 MVP 아이템&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/84ubM/btsJuWtEOgS/yK2KfKkHkM5P6wkpagtnY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F84ubM%2FbtsJuWtEOgS%2FyK2KfKkHkM5P6wkpagtnY0%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;640&quot; height=&quot;382&quot; data-filename=&quot;제목 없음.png&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;735&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;주제1 MVP 아이템&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;1.&amp;nbsp; 주제 선택 및 팀 배정, 두근두근 첫 미팅 &lt;b&gt;(feat. PM은 나야 나!)&lt;/b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;크립톤이라는 아이템&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;/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;그렇게 팀 배정까지 받고 온라인으로 팀원들과의 첫 미팅을 진행함.&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;미팅에서는 PM 선발 및 개발 스펙을 정하고 앞으로 개발을 어떻게 진행할지에 대한 논의를 하였음.&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;결과적으로 내가 PM 겸 풀스택을 맡아 진행하게 되었고, 창업 아이템을 기획하신 PO분과&amp;nbsp;5명의 팀원들과의 소통을 책임지는 막중한 임무를 맡아버렸음. &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;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 팀 내 자원인 디자이너, 프론트, 백엔드분들의 실력(개발 스펙 및 경력 등)을 파악해서 프로젝트 진행에 속도를 높여야겠다고 생각하여 파트를 나누었음.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;ℹ️팀 자원&lt;br /&gt;&amp;nbsp;- 디자이너 1명, 프론트 엔드 1명, 풀 스택 2명, 백엔드 2명&lt;br /&gt;&lt;br /&gt;ℹ️팀명&lt;br /&gt;&amp;nbsp;- 크립톤 가디언즈&lt;/blockquote&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;백엔드 쪽에 개발 욕심이 더 많았지만, 데드라인이 짧은 MVP 개발조건을 맞추기 위해 프론트 개발을 한다고 함.&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;미팅하면서 놀랐던 점은 그렇게 크지 않은 공모전 대회라서 대학교 팀별 과제와 다르지 않을 거라 생각했는데 팀원들이 적극적이고 소통을 열심히 해주셔서 감사하고 놀랐음... &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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;2. 첫 미팅 이후 온라인 협업 Start!!&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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팀은 간단하게 랜딩페이지를 만드는 게 아니라 실제 초기 창업팀의 아이템을 MVP로 개발해서 비지니스 가치를 창출하는 게 목표라고 하던데...&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;MVP가 뭐지?? 내가 들어본 MVP는 게임에서 들어본 말밖에 없는데  시작부터 난관 봉착!!&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;  &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;MVP(Minimum Viable Product)란?&lt;br /&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;간단하게 말해서 최소 기능 구현 제품으로, 구현하고자 하는 제품의 핵심적인 가치를 골라 최소한의 기능만을 담아낸 제품을 말함.&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&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;이 과정에서 경험해보지 못한 깃 이슈를 사용하여 커밋 메세지 작성하는 방법이나 Pull Request(PR), 브랜치 전략 등&amp;nbsp;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;협업에 필요한 깃 기능을 사용해 보면서 실 업무에서 PR은 꼭 사용하면 좋겠다는 것을 느꼈음.&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;특히 PR 기능은 깃으로 어떤 소스, 기능을 수정했는지 설명을 추가하여 직관적으로 볼 수 있기 때문에 관리자 입장에서 소스 관리하기에 좋을 것 같다는 장점을 느낄 수 있었음.&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;하지만 그만큼 절차가 생기기 때문에 시간이 딜레이 되는 것 같아 지금처럼 빠르게 개발해야 하는 경우는 적합하지 않다고 판단하여 우리 팀은 각자 PR을 진행하기로 함.&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;미팅은 디스코드로 진행하고 노션으로 필요한 자료나 정보를 공유, 피그마로 화면 UI 플로우를 볼 수 있었음.&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;노션으로 API 명세서를 공유하여 작업을 진행하니 실시간으로 확인할 수 있어 편리했음.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1307&quot; data-origin-height=&quot;594&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/by97jw/btsJuAEtpSY/IWLZuyqkkyWi1pZ41rDgK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/by97jw/btsJuAEtpSY/IWLZuyqkkyWi1pZ41rDgK0/img.png&quot; data-alt=&quot;API 명세서&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/by97jw/btsJuAEtpSY/IWLZuyqkkyWi1pZ41rDgK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fby97jw%2FbtsJuAEtpSY%2FIWLZuyqkkyWi1pZ41rDgK0%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;647&quot; height=&quot;294&quot; data-origin-width=&quot;1307&quot; data-origin-height=&quot;594&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;API 명세서&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;또한 창업팀에서 제공한 작업 플로우와 피그마의 UI를 보면서 필수 기능과 선택 기능을 분리하여 작업 우선순위를 매겨 작업을 진행함.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;크립토 가디언즈.png&quot; data-origin-width=&quot;1976&quot; data-origin-height=&quot;1798&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coOaK7/btsJwfMFuqC/ifGMWFkTbubhzWqp5MCRCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coOaK7/btsJwfMFuqC/ifGMWFkTbubhzWqp5MCRCK/img.png&quot; data-alt=&quot;창업팀에서 제공한 작업 플로우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coOaK7/btsJwfMFuqC/ifGMWFkTbubhzWqp5MCRCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoOaK7%2FbtsJwfMFuqC%2FifGMWFkTbubhzWqp5MCRCK%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;484&quot; height=&quot;440&quot; data-filename=&quot;크립토 가디언즈.png&quot; data-origin-width=&quot;1976&quot; data-origin-height=&quot;1798&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;p data-ke-size=&quot;size16&quot;&gt;나는 프론트 쪽에 붙어서 로그인, 회원가입 및 아이디 중복 확인 API를 보내는 컴포넌트를 개발하였는데 전 직장에서 개발한 리액트 컴포넌트 구조와는 달랐음.&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;스타일드 컴포넌트를 사용하여 CSS를 따로 두는 게 아니라 컴포넌트 내부에 설정하여 필요한 태그를 가져와서 사용하는 구조였음.&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;내가 느낀 바로는 스타일드 컴포넌트를 사용하여 컴포넌트를 개발하면 css나 html태그를 한 컴포넌트에서 관리하여 스타일 관련 소스가 분리되어 있다는 장점이 있어서 service 로직을 개발하는 데 집중할 수 있었음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;3. 개발부터 배포, 마지막 파이널 데이까지&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;이유는 창업팀의 아이템에 대한 정보를 일부 공개하여 개발 초기에 갈피를 못 잡았던 점, 프론트 개발 자원이 부족했던 점등 다소 아쉬운 점들이 많았음.&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;하지만 불평만 하고 있다면 달라지는 게 없기 때문에 팀원들의 궁금한 점을 PO분과 최대한 소통하여 해소시키려 노력하였고 그걸로 부족하다면 전체 미팅을 잡아 진행하였음.&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;또한 부족한 프론트 개발 자원을 지원하여 로그인 관련 기능 개발을 맡아 진행하였고, GCP(Google Cloud Platform)로 배포할 백엔드 서버를 구축하여 API 연동할 수 있는 환경을 세팅하였음.&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;다른 팀원들도 프론트를 vercel에 배포하고 테스트를 진행함.&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;팀원 한분이 발표를 맡아주셨고 다른 팀원분들이 시연을 맡아주셨음.&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 크립톤 아이템에서 우리 팀이 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;/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;약 10일간의 여정이 끝이남과 동시에 짧지만 여러 가지를 배울 수 있는 해커톤의 매력을 느낄 수 있는 경험이었음! &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;
&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;/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;
&lt;p data-ke-size=&quot;size16&quot;&gt; 참고 사이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.waveon.io/blog/why-mvp&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.waveon.io/blog/why-mvp&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1725860716279&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;MVP(Minimum Viable Product)의 뜻과 MVP 테스트가 꼭 필요한 이유&quot; data-og-description=&quot;스타트업 창업을 하려고 보니 내가 가진 창업 아이템이 시장에 먹힐 만한 건지 모르겠다.창업을 꿈꾸는 사람이라면 누구나 시장성에 대한 고민을 하기 마련입니다. 좋은 아이디어가 떠올랐는데&quot; data-og-host=&quot;www.waveon.io&quot; data-og-source-url=&quot;https://www.waveon.io/blog/why-mvp&quot; data-og-url=&quot;https://www.waveon.io/blog/why-mvp&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mBQmh/hyW2TuMbij/qxHsdi5nPTvctPakjb7T2K/img.jpg?width=1920&amp;amp;height=1280&amp;amp;face=0_0_1920_1280,https://scrap.kakaocdn.net/dn/E62UW/hyWZiCZ25m/eGmrrnkUIj6AAMvOKvfpLK/img.jpg?width=1920&amp;amp;height=1280&amp;amp;face=0_0_1920_1280,https://scrap.kakaocdn.net/dn/VgghJ/hyW2TIjpjZ/VR8hK0GWPvYrDNFLmjVolK/img.jpg?width=700&amp;amp;height=468&amp;amp;face=0_0_700_468&quot;&gt;&lt;a href=&quot;https://www.waveon.io/blog/why-mvp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.waveon.io/blog/why-mvp&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mBQmh/hyW2TuMbij/qxHsdi5nPTvctPakjb7T2K/img.jpg?width=1920&amp;amp;height=1280&amp;amp;face=0_0_1920_1280,https://scrap.kakaocdn.net/dn/E62UW/hyWZiCZ25m/eGmrrnkUIj6AAMvOKvfpLK/img.jpg?width=1920&amp;amp;height=1280&amp;amp;face=0_0_1920_1280,https://scrap.kakaocdn.net/dn/VgghJ/hyW2TIjpjZ/VR8hK0GWPvYrDNFLmjVolK/img.jpg?width=700&amp;amp;height=468&amp;amp;face=0_0_700_468');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MVP(Minimum Viable Product)의 뜻과 MVP 테스트가 꼭 필요한 이유&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스타트업 창업을 하려고 보니 내가 가진 창업 아이템이 시장에 먹힐 만한 건지 모르겠다.창업을 꿈꾸는 사람이라면 누구나 시장성에 대한 고민을 하기 마련입니다. 좋은 아이디어가 떠올랐는데&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.waveon.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 모드/경험</category>
      <category>블레이버스</category>
      <category>해커톤</category>
      <category>후기</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/56</guid>
      <comments>https://precious-value.tistory.com/56#entry56comment</comments>
      <pubDate>Mon, 9 Sep 2024 17:03:57 +0900</pubDate>
    </item>
    <item>
      <title>[Docker-Compose]PostgreSQL 컨테이너 생성 시 DB 초기화하기</title>
      <link>https://precious-value.tistory.com/55</link>
      <description>&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;!-- jQuery CDN --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://code.jquery.com/jquery-3.2.1.min.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
jQuery(document).ready(function($) {
    // &lt;a&gt;&lt;/a&gt; 태그 중 #으로 링크된 태그에 기능 설정
    $(&quot;a[href^='#']&quot;).click(function(event) {
        event.preventDefault();
        var target = $(this.hash);
        $('html, body').animate({scrollTop: target.offset().top}, 500);
    });
});
&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평소 실제 DB 서버에서 직접 테스트할 수 없으니,&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;매번 DBeaver로 DB를 백업해서 SQL문을 뽑아내고&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;PostgreSQL 컨테이너를 띄워 데이터베이스를 초기화하고 있었는데...&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가 세팅되면 좋겠다~ 싶어서&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;여러 삽질 끝에 docker-compose와 dockerfile을 사용하여 설정하는 방법을 완료했음!!&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;u&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;그 방법&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;을 공유하고자 함 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;☘️ INDEX&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;#index1&quot;&gt;1. 필자의 환경 스펙 설명&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#index2&quot;&gt;2. 관련 설정 파일들 설명&lt;/a&gt;&lt;br /&gt;&amp;nbsp;- docker-compose.yml&lt;br /&gt;&amp;nbsp;- dockerfile&lt;br /&gt;&amp;nbsp;- init.sh&lt;br /&gt;&lt;a href=&quot;#index3&quot;&gt;3. 도커 컴포즈 실행&lt;/a&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b id=&quot;index1&quot;&gt;1. 필자의 환경 스펙 설명&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 필자가 어떤 db툴을 쓰고 어떤 db 이미지를 사용해서 컨테이너를 띄웠는지 간략하게 설명하겠음!&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;Docker Image : postgres(버전은 그냥 제일 최신버전 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB Tool : DBeaver( 다운로드 링크 : &lt;a href=&quot;https://dbeaver.io/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dbeaver.io/download/&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB : PostgreSQL(도커 컨테이너)&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;필자는 DBeaver로 데이터를 백업할 때 포맷 타입은 custom으로 하고 파일명은 restore.sql로 만들었음.&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;custom 타입으로 복원을 하면 psql로 복원할 수 없고 pg_restore 명령어를 사용해서 복원을 진행해야 함.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b id=&quot;index2&quot;&gt;2. 관련 설정 파일들 설명&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;2-(1) docker-compose.yml : 컨테이너를 정의하고 설정하는 다양한 옵션들이 포함&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;먼저 도커 컴포즈 파일을 만들어서 버전, database 서비스를 정의하고&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;컨테이너 실행 시 docker run ... 뒤에 붙는 옵션들을 도커 컴포즈로 설정한다고 생각하면 될 듯!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1721124056128&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3'

services:
  database:
    build:
      context: .
      dockerfile: Dockerfile_test    
    image: test_image:latest
    container_name: test_db
    environment:
      POSTGRES_DB : test
      POSTGRES_USER : postgres
      POSTGRES_PASSWORD : 0000
    ports:
      - &quot;5432:5432&quot;
    volumes:
      - ./restore.sql:/docker-entrypoint-initdb.d/restore.sql      
    restart: always&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Version : &lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;compose file format의 버전으로 파일의 첫 줄에 선언함. 파일의 규격에 따라 지원하는 옵션이 달라지는데,&lt;span style=&quot;background-color: #f8f9fa; color: #343a40; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ldquo;3&amp;rdquo;이라만 적으면 3으로 시작하는 최신 버전을 사용한다는 의미&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa; color: #343a40; text-align: start;&quot;&gt;compose 파일의 버전과 호환성을 안내한 공식 문서(&lt;a href=&quot;https://docs.docker.com/compose/compose-file/legacy-versions/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.docker.com/compose/compose-file/legacy-versions/&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa; color: #343a40; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa; color: #343a40; text-align: start;&quot;&gt;Service : 여러 개의 서비스를 정의할 수 있는 섹션으로 각 서비스는 하나의 컨테이너에 해당하며, 필자는 &quot;database&quot;라는 서비스 하나를 정의&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa; color: #343a40; text-align: start;&quot;&gt;Database : database라는 이름의 서비스를 정의&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa; color: #343a40; text-align: start;&quot;&gt;Build : 도커 파일을 사용하여 이미지를 빌드할 때 설정을 정의&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa; color: #343a40; text-align: start;&quot;&gt;Context : 도커 빌드 콘텍스트의 경로를 지정&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa; color: #343a40; text-align: start;&quot;&gt;Dockerfile : 사용할 도커 파일의 이름을 지정(default : Dockerfile)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa; color: #343a40; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa; color: #343a40; text-align: start;&quot;&gt;Image : 이미지의 이름 및 태그를 지정&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #343a40;&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa;&quot;&gt;Container_name : 컨테이너 이름을 지정&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #343a40;&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa;&quot;&gt;Environment : 컨테이너 내에서 사용할 환경 변수를 정의하며, PostgreSQL 데이터베이스 설정에 필요한 변수를 지정&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #343a40;&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa;&quot;&gt;POSTGRES_DB : 초기화할 DB 이름&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #343a40;&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa;&quot;&gt;POSTGRES_USER : 데이터베이스 사용자 이름&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #343a40;&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa;&quot;&gt;POSTGRES_PASSWORD : 데이터베이스 사용자 비밀번호&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #343a40;&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa;&quot;&gt;Ports : 컨테이너 포트 설정&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #343a40;&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa;&quot;&gt;Volums : 호스트와 컨테이너 간의 파일 시스템 매핑을 정의&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;필자의 경우 DB 백업 파일을 컨테이너의 특정 디렉토리에 복사함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #343a40;&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa;&quot;&gt;Restarts : 컨테이너가 중지될 때 자동으로 다시 시작하는 옵션으로 'always'로 설정하면 항상 다시 시작됨(default : no)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;2-(2) Dockerfile : 도커 이미지를 생성하는 데 사용되는 스크립트 파일&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;도커 컴포즈에서 설정한 build 안의 옵션들을 바탕으로 도커 파일을 작성함.&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;필자는 도커 컴포즈에 설정한 대로 Dockerfile_test로 파일명을 만들었음!! &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;설정을 하지 않으면 위에서 말했듯이 Dockerfile으로 파일명을 만들면 됨!! &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1721178415625&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM postgres

# restore.sql 파일 복사
COPY init.sh /docker-entrypoint-initdb.d/
COPY restore.sql /docker-entrypoint-initdb.d/

# 실행 권한 부여
RUN chmod +x /docker-entrypoint-initdb.d/init.sh&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FROM postgres : postgres라는 이미지를 기반으로 설정&lt;/li&gt;
&lt;li&gt;COPY a b : 명령어는 말 그대로 a라는 내 파일을 b라는 경로에 복사하겠다는 도커파일 명령어임(경로 설정 주의!)&lt;/li&gt;
&lt;li&gt;RUN : 이미지 빌드 시 실행할 명령어를 지정하는데 필자는 init.sh 파일의 권한을 변경하는 명령어를 설정함.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;2-(3) init.sh : PostgreSQL 데이터베이스를 pg_restore 명령어를 사용하여 복원하는 역할 &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;init.sh 파일은 필자가 만든 커스텀 bash 스크립트임 &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;pre id=&quot;code_1721178997534&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash
set -e

echo &quot;Running pg_restore&quot;

# SQL 스크립트 실행
pg_restore -U &quot;$POSTGRES_USER&quot; -v -d &quot;$POSTGRES_DB&quot; /docker-entrypoint-initdb.d/restore.sql&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;#!/bin/bash : 이 스크립트가 Bash 셸에서 실행되어야 함을 정의(모든 bash 스크립트는 이 줄로 시작해야 함)&lt;/li&gt;
&lt;li&gt;set -e : 옵션 설정으로 에러가 발생했을 때 이후의 명령어들이 실행되지 않도록 함.&lt;/li&gt;
&lt;li&gt;echo &quot;&quot; : &quot;&quot; 안의 메세지 출력(print랑 똑같음)&lt;/li&gt;
&lt;li&gt;pg_restore : postgreSQL DB를 복원하는 명령어
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$POSTGRES_USER, POSTGRES_DB : 도커 컴포즈에 설정된 환경 변수를 가져옴.&lt;/li&gt;
&lt;li&gt;-U : postgreSQL 사용자 이름 설정&lt;/li&gt;
&lt;li&gt;-v : 상세 모드로 실행하여 복원 과정의 자세한 에러 표시&lt;/li&gt;
&lt;li&gt;-d : DB 이름 설정&lt;/li&gt;
&lt;li&gt;/docker-entrypoint-initdb.d/restore.sql : 복원할 SQL 파일 경로로 컨테이너의 경로임.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가적으로 도커의 &lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;docker-entrypoint-initdb.d&lt;/span&gt;&lt;/b&gt;&amp;nbsp;경로는 PostgreSQL Docker 이미지에서 초기화 스크립트와 SQL 파일을 자동으로 실행하는 데 사용되는 경로임.&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;즉 자동으로 restore.sql 파일을 실행시켜 복원이 진행되어야 하지만!!&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;위에서 언급했다시피 restore.sql 파일은 커스텀 타입이라 pg_restore 명령어를 사용하여 복원을 진행해야만 하기 때문에!!&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;위 방법처럼 init.sh라는 커스텀 스크립트를 만들어서 설정을 진행함!! &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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #953b34;&quot;&gt;&lt;b id=&quot;index3&quot;&gt; &lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;3. 도커 컴포즈 실행&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&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;필자는 vscode를 사용하여 도커 환경을 설정했기 때문에&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;vscode 터미널에서 git bash로 아래 명령어를 실행함.&lt;/p&gt;
&lt;pre id=&quot;code_1721179888004&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker-compose up -d	# 도커 컴포즈 실행 명령어

docker-compose ps	# 현재 실행중인 서비스의 상태 확인 명령어

docker-compose logs	# 서비스의 로그 확인 명령어&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1614&quot; data-origin-height=&quot;101&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bR1g4Y/btsIBVID2B8/8PTI3kkAILf0VRtR8q0iUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bR1g4Y/btsIBVID2B8/8PTI3kkAILf0VRtR8q0iUk/img.png&quot; data-alt=&quot;도커 데스크톱 컨테이너 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bR1g4Y/btsIBVID2B8/8PTI3kkAILf0VRtR8q0iUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbR1g4Y%2FbtsIBVID2B8%2F8PTI3kkAILf0VRtR8q0iUk%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;1614&quot; height=&quot;101&quot; data-origin-width=&quot;1614&quot; data-origin-height=&quot;101&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;도커 데스크톱에서 컨테이너 목록에 초록색으로 컨테이너가 실행되는 것을 확인할 수 있음!!&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;pre id=&quot;code_1721180409641&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bash: init.sh: cannot excute: required file not found&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;/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;a href=&quot;https://unix.stackexchange.com/questions/721844/linux-bash-shell-script-error-cannot-execute-required-file-not-found&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://unix.stackexchange.com/questions/721844/linux-bash-shell-script-error-cannot-execute-required-file-not-found&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1721180441410&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Linux Bash Shell Script Error: cannot execute: required file not found&quot; data-og-description=&quot;I have two similar scripts with different names. One works fine but other throws error. Can anyone please tell me what is the issue? This is my test.sh scripts which works fine [nnice@myhost Script...&quot; data-og-host=&quot;unix.stackexchange.com&quot; data-og-source-url=&quot;https://unix.stackexchange.com/questions/721844/linux-bash-shell-script-error-cannot-execute-required-file-not-found&quot; data-og-url=&quot;https://unix.stackexchange.com/questions/721844/linux-bash-shell-script-error-cannot-execute-required-file-not-found&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/beS99Y/hyWCMiBBFk/1rtDFGLplmdD324a5tkNWK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://unix.stackexchange.com/questions/721844/linux-bash-shell-script-error-cannot-execute-required-file-not-found&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://unix.stackexchange.com/questions/721844/linux-bash-shell-script-error-cannot-execute-required-file-not-found&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/beS99Y/hyWCMiBBFk/1rtDFGLplmdD324a5tkNWK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Linux Bash Shell Script Error: cannot execute: required file not found&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I have two similar scripts with different names. One works fine but other throws error. Can anyone please tell me what is the issue? This is my test.sh scripts which works fine [nnice@myhost Script...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;unix.stackexchange.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;notepad++ 프로그램을 사용해 줄 끝 문자 형식을 Unix(LF)로 변경해서 저장 후 다시 실행해 보길!!&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;혹시 몰라 notepad++ 다운로드 링크(&lt;a href=&quot;https://notepad-plus-plus.org/downloads/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://notepad-plus-plus.org/downloads/&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;지금까지 도커 컴포즈를 이용해 postgreSQL 데이터베이스 초기화 방법이었음!!&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;</description>
      <category>개발자 모드/응용</category>
      <category>Docker</category>
      <category>docker-compose</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/55</guid>
      <comments>https://precious-value.tistory.com/55#entry55comment</comments>
      <pubDate>Wed, 17 Jul 2024 10:54:03 +0900</pubDate>
    </item>
    <item>
      <title>[GIT] 깃헙 README 3D 잔디 심기</title>
      <link>https://precious-value.tistory.com/54</link>
      <description>&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;!-- jQuery CDN --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://code.jquery.com/jquery-3.2.1.min.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
jQuery(document).ready(function($) {
    // &lt;a&gt;&lt;/a&gt; 태그 중 #으로 링크된 태그에 기능 설정
    $(&quot;a[href^='#']&quot;).click(function(event) {
        event.preventDefault();
        var target = $(this.hash);
        $('html, body').animate({scrollTop: target.offset().top}, 500);
    });
});
&lt;/script&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;/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;나의 리드미에도 3D 잔디를 장착하고 싶은 욕구가 생겼음!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;595&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtqXh4/btsIs2G4LsN/H4OjCAFzN7g8FCMisw4KI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtqXh4/btsIs2G4LsN/H4OjCAFzN7g8FCMisw4KI1/img.png&quot; data-alt=&quot;필자의 3D 잔디 화면(블록 ver.)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtqXh4/btsIs2G4LsN/H4OjCAFzN7g8FCMisw4KI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtqXh4%2FbtsIs2G4LsN%2FH4OjCAFzN7g8FCMisw4KI1%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;434&quot; height=&quot;295&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;595&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;필자의 3D 잔디 화면(블록 ver.)&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;  고로 &lt;b&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;리드미에 3D 잔디 심기 튜토리얼&lt;/span&gt;&lt;/b&gt;을 시작하겠음!!  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt; 튜토리얼 순서&lt;br /&gt;&lt;/b&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #781b33;&quot;&gt; &lt;b&gt;&lt;a href=&quot;#index1&quot;&gt;1. 독자 닉네임으로 된 Repository 추가(있다면 생략)&lt;/a&gt;&lt;/b&gt; &lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #f89009;&quot;&gt; &lt;b&gt;&lt;a href=&quot;#index2&quot;&gt;2. 토큰 생성&lt;/a&gt;&lt;/b&gt; &lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt; &lt;b&gt;&lt;a href=&quot;#index3&quot;&gt;3. Repository에 토큰 등록&amp;nbsp;&lt;/a&gt;&lt;/b&gt; &lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #009a87;&quot;&gt; &lt;b&gt;&lt;a href=&quot;#index4&quot;&gt;4. Actions 추가 후 Run workFlow&amp;nbsp;&lt;/a&gt;&lt;/b&gt; &lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt; &lt;b&gt;&lt;a href=&quot;#index5&quot;&gt;5. 리드미에 코드 추가&lt;/a&gt;&lt;/b&gt; &lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt; &lt;b&gt;&lt;a href=&quot;#index6&quot;&gt;6. 403 권한 에러 시 해결 방법&lt;/a&gt;&lt;/b&gt; &lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote id=&quot;#index1&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #781b33;&quot;&gt;&lt;b id=&quot;index1&quot;&gt;1. 독자 닉네임으로 된 Repository 추가(있다면 생략)&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;이때 레포지토리명을 자신의 닉네임과 같은 걸로 만들어야지만 Overview 화면에서 리드미를 볼 수 있음!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;823&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5qXLw/btsIswBRTbY/tMYkMbQxaRBiad2NQOckeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5qXLw/btsIswBRTbY/tMYkMbQxaRBiad2NQOckeK/img.png&quot; data-alt=&quot;레포지토리 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5qXLw/btsIswBRTbY/tMYkMbQxaRBiad2NQOckeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5qXLw%2FbtsIswBRTbY%2FtMYkMbQxaRBiad2NQOckeK%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;479&quot; height=&quot;495&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;823&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;p data-ke-size=&quot;size16&quot;&gt;필자는 이미 레포지토리가 있어서 중복 에러가 뜨지만 새로 만드는 독자는 문제없이 진행하면 됨!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote id=&quot;#index2&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b id=&quot;index2&quot;&gt;2. 토큰 생성&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AFAAB/btsIqR8hrxx/GIc0RLpJsew6rT6DS2lwyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AFAAB/btsIqR8hrxx/GIc0RLpJsew6rT6DS2lwyk/img.png&quot; data-alt=&quot;깃헙 우측 상단 버튼&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AFAAB/btsIqR8hrxx/GIc0RLpJsew6rT6DS2lwyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAFAAB%2FbtsIqR8hrxx%2FGIc0RLpJsew6rT6DS2lwyk%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;619&quot; height=&quot;60&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;60&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;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;settings &amp;gt; 프로필 설정에서 좌측 메뉴 맨 밑 &amp;gt; Developer settings 클릭!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;295&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ADAbt/btsIrdQOkdj/131suEhByy183GZrh5X2K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ADAbt/btsIrdQOkdj/131suEhByy183GZrh5X2K1/img.png&quot; data-alt=&quot;토큰 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ADAbt/btsIrdQOkdj/131suEhByy183GZrh5X2K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FADAbt%2FbtsIrdQOkdj%2F131suEhByy183GZrh5X2K1%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;295&quot; height=&quot;188&quot; data-origin-width=&quot;295&quot; data-origin-height=&quot;188&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;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;필자는 생성할 때 Select scopes은 &lt;span style=&quot;background-color: #ffffff; color: #010409; text-align: left;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #010409; text-align: left;&quot;&gt;notifications&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그런 다음 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;토큰 키&lt;/b&gt;&lt;/span&gt;를 잃어버리지 않게 소중하게 저장하기!!(기존 토큰을 사용해도 무방한데 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;토큰 키&lt;/b&gt;&lt;/span&gt;를 알고 있어야 함!!)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote id=&quot;#index3&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b id=&quot;index3&quot;&gt;3. Repository에 토큰 등록&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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번에서 만든 레포지토리로 이동하여&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1191&quot; data-origin-height=&quot;811&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsfpAr/btsIseIgfSw/wUISLozMS7j4Kwx8XHHiC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsfpAr/btsIseIgfSw/wUISLozMS7j4Kwx8XHHiC0/img.png&quot; data-alt=&quot;레포지토리 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsfpAr/btsIseIgfSw/wUISLozMS7j4Kwx8XHHiC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsfpAr%2FbtsIseIgfSw%2FwUISLozMS7j4Kwx8XHHiC0%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;610&quot; height=&quot;415&quot; data-origin-width=&quot;1191&quot; data-origin-height=&quot;811&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;p data-ke-size=&quot;size16&quot;&gt;Settings &amp;gt; 좌측 메뉴 &amp;gt; Secrets and variables &amp;gt; Actions 메뉴로 이동&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;New repository secret 클릭 후 Name : Token / Secret : 발급한 토큰 키를 입력하여 Add secret 버튼 클릭하면 등록완료!! &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote id=&quot;#index4&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b id=&quot;index4&quot;&gt;4. Actions 추가 후 Run workFlow&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 레포지토리로 돌아와서 이번엔 Actions 메뉴 클릭!!&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1175&quot; data-origin-height=&quot;631&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyky87/btsItjohWbL/YKyib1QWSQP0Xol3q9kVXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyky87/btsItjohWbL/YKyib1QWSQP0Xol3q9kVXK/img.png&quot; data-alt=&quot;액션 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyky87/btsItjohWbL/YKyib1QWSQP0Xol3q9kVXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcyky87%2FbtsItjohWbL%2FYKyib1QWSQP0Xol3q9kVXK%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;359&quot; data-origin-width=&quot;1175&quot; data-origin-height=&quot;631&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;p data-ke-size=&quot;size16&quot;&gt;set up a workflow yourself 클릭!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl6FLR/btsIrx21YRb/Khs3lFzIqBi3boMcDuNkc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl6FLR/btsIrx21YRb/Khs3lFzIqBi3boMcDuNkc0/img.png&quot; data-alt=&quot;워크 플로우 추가 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl6FLR/btsIrx21YRb/Khs3lFzIqBi3boMcDuNkc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl6FLR%2FbtsIrx21YRb%2FKhs3lFzIqBi3boMcDuNkc0%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;1008&quot; height=&quot;254&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;254&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;pre id=&quot;code_1720503621477&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;name: GitHub-Profile-3D-Contrib

on:
  schedule: # 03:00 JST == 18:00 UTC
    - cron: &quot;0 18 * * *&quot;
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest
    name: generate-github-profile-3d-contrib
    steps:
      - uses: actions/checkout@v3
      - uses: yoshi389111/github-profile-3d-contrib@0.7.1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          USERNAME: ${{ github.repository_owner }}
      - name: Commit &amp;amp; Push
        run: |
          git config user.name github-actions
          git config user.email github-actions@github.com
          git add -A .
          git commit -m &quot;generated&quot;
          git push&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;이후 contents 부분에 위 코드를 복붙하고 git config user.name과 user.email을 독자님들 정보로 수정!&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;다했다면 우측 상단에 Commit changes... 초록버튼 클릭하여 커밋 push!!&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;추가가 완료됐다면 필자처럼 All workflows 목록에 등록한 &lt;span style=&quot;background-color: #ffffff; color: #010409; text-align: start;&quot;&gt;GitHub-Profile-3D-Contrib(main.yml)이 보일 것임!!&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;color: #010409;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Actions &amp;gt; 좌측 메뉴에서 &lt;span style=&quot;background-color: #ffffff; color: #010409; text-align: start;&quot;&gt;GitHub-Profile-3D-Contrib&lt;/span&gt; 클릭 &amp;gt; Run workflow &amp;gt; 초록색 Run workflow 클릭!!☘️&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;119&quot; data-origin-height=&quot;113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y6p00/btsIsyfSQ7u/0qsRrQmPBtZgeqeaJtEkEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y6p00/btsIsyfSQ7u/0qsRrQmPBtZgeqeaJtEkEk/img.png&quot; data-alt=&quot;워크 플로우 실행 버튼&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y6p00/btsIsyfSQ7u/0qsRrQmPBtZgeqeaJtEkEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY6p00%2FbtsIsyfSQ7u%2F0qsRrQmPBtZgeqeaJtEkEk%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;119&quot; height=&quot;113&quot; data-origin-width=&quot;119&quot; data-origin-height=&quot;113&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #010409;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;워크 플로우가 성공적으로 실행이 되었다면 초록색 체크 상태가 되고 실패하면 빨간색 x 표시가 뜸!!&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 style=&quot;color: #010409;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;혹 에러를 확인했는데 403 에러가 뜬다면 6번을 먼저 확인하면 됨!! &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote id=&quot;#index5&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b id=&quot;index5&quot;&gt;5. 리드미에 코드 추가&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 레포지토리로 이동하여 README.md 파일을 수정&lt;/p&gt;
&lt;pre id=&quot;code_1720503638366&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;![](./profile-3d-contrib/profile-green-animate.svg)&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;원하는 위치에 위 코드를 추가하면 되는데, 위 코드는 Markdown에서 이미지를 삽입할 때 쓰는 코드라서&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;여기까지 하면 3D 잔디 연동이 끝났음!! &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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/yoshi389111/github-profile-3d-contrib#step-4-add-image-to-readmemd&quot;&gt;https://github.com/yoshi389111/github-profile-3d-contrib#step-4-add-image-to-readmemd&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1720504020879&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - yoshi389111/github-profile-3d-contrib: This GitHub Action creates a GitHub contribution calendar on a 3D profile image.&quot; data-og-description=&quot;This GitHub Action creates a GitHub contribution calendar on a 3D profile image. - yoshi389111/github-profile-3d-contrib&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/yoshi389111/github-profile-3d-contrib#step-4-add-image-to-readmemd&quot; data-og-url=&quot;https://github.com/yoshi389111/github-profile-3d-contrib&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pRVKi/hyWztcliW2/31kF6wN6Lk1qALRz277FI0/img.png?width=1280&amp;amp;height=850&amp;amp;face=0_0_1280_850&quot;&gt;&lt;a href=&quot;https://github.com/yoshi389111/github-profile-3d-contrib#step-4-add-image-to-readmemd&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/yoshi389111/github-profile-3d-contrib#step-4-add-image-to-readmemd&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pRVKi/hyWztcliW2/31kF6wN6Lk1qALRz277FI0/img.png?width=1280&amp;amp;height=850&amp;amp;face=0_0_1280_850');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - yoshi389111/github-profile-3d-contrib: This GitHub Action creates a GitHub contribution calendar on a 3D profile image.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This GitHub Action creates a GitHub contribution calendar on a 3D profile image. - yoshi389111/github-profile-3d-contrib&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;blockquote id=&quot;#index6&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b id=&quot;index6&quot;&gt;6. 403 권한 에러 시 해결 방법&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;673&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yCIeQ/btsItgr4J5o/2zbJKjCkBPdXcykZFN4aj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yCIeQ/btsItgr4J5o/2zbJKjCkBPdXcykZFN4aj1/img.png&quot; data-alt=&quot;에러 로그&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yCIeQ/btsItgr4J5o/2zbJKjCkBPdXcykZFN4aj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyCIeQ%2FbtsItgr4J5o%2F2zbJKjCkBPdXcykZFN4aj1%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;1512&quot; height=&quot;673&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;673&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;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 새로 만든 레포지토리 주소에 권한이 없어서 403 에러가 떴음.&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;갓글에 검색해서 찾아보니 git action 설정에서 permission을 수정하면 된다고 함!!&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;먼저 깃 레포지토리에서 settings 메뉴 &amp;gt; 좌측 메뉴에서 Actions &amp;gt; General 클릭!&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;맨 밑에 Workflow permissions 탭에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u8k0Q/btsIsKHbx8t/P59002z5wrRlSp4ZNaDZy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u8k0Q/btsIsKHbx8t/P59002z5wrRlSp4ZNaDZy1/img.png&quot; data-alt=&quot;action permission 수정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u8k0Q/btsIsKHbx8t/P59002z5wrRlSp4ZNaDZy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu8k0Q%2FbtsIsKHbx8t%2FP59002z5wrRlSp4ZNaDZy1%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;786&quot; height=&quot;354&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;action permission 수정&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;위 사진처럼 수정&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;a href=&quot;https://h-owo-ld.tistory.com/264&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://h-owo-ld.tistory.com/264&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/westreed/ProgrammersAlgorithmDeploy&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/westreed/ProgrammersAlgorithmDeploy&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 모드/응용</category>
      <category>git</category>
      <category>git 3d 잔디심기</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/54</guid>
      <comments>https://precious-value.tistory.com/54#entry54comment</comments>
      <pubDate>Tue, 9 Jul 2024 15:04:21 +0900</pubDate>
    </item>
    <item>
      <title>[Django]settings.py 분리 후 환경 변수 적용 이슈</title>
      <link>https://precious-value.tistory.com/53</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;  &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;이슈 상황&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;a href=&quot;https://wikidocs.net/75560&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wikidocs.net/75560&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718868473214&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;4-08 settings.py 분리&quot; data-og-description=&quot;&amp;#96;[완성 소스]&amp;#96; : [github.com/pahkey/jump2django/tree/4-08](https://github.com/pahkey/jump2django/tree/4-&amp;hellip;&quot; data-og-host=&quot;wikidocs.net&quot; data-og-source-url=&quot;https://wikidocs.net/75560&quot; data-og-url=&quot;https://wikidocs.net/75560&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rtUuE/hyWoNpeoCa/vdbCJ1zHpHk9V6zDN69AL1/img.jpg?width=94&amp;amp;height=128&amp;amp;face=0_0_94_128,https://scrap.kakaocdn.net/dn/baJ8u0/hyWoEsjfQa/SB8TwrlLeNTMGes8m2oaok/img.png?width=976&amp;amp;height=555&amp;amp;face=0_0_976_555,https://scrap.kakaocdn.net/dn/0MJlV/hyWoOPdwRi/0Ub0lKeYWDKUjLOhEsizkK/img.png?width=976&amp;amp;height=555&amp;amp;face=0_0_976_555&quot;&gt;&lt;a href=&quot;https://wikidocs.net/75560&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wikidocs.net/75560&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rtUuE/hyWoNpeoCa/vdbCJ1zHpHk9V6zDN69AL1/img.jpg?width=94&amp;amp;height=128&amp;amp;face=0_0_94_128,https://scrap.kakaocdn.net/dn/baJ8u0/hyWoEsjfQa/SB8TwrlLeNTMGes8m2oaok/img.png?width=976&amp;amp;height=555&amp;amp;face=0_0_976_555,https://scrap.kakaocdn.net/dn/0MJlV/hyWoOPdwRi/0Ub0lKeYWDKUjLOhEsizkK/img.png?width=976&amp;amp;height=555&amp;amp;face=0_0_976_555');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;4-08 settings.py 분리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;`[완성 소스]` : [github.com/pahkey/jump2django/tree/4-08](https://github.com/pahkey/jump2django/tree/4-&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wikidocs.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;216&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xXNZb/btsH51paQCP/W3N6X59XxJgNXIKMEEhv2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xXNZb/btsH51paQCP/W3N6X59XxJgNXIKMEEhv2K/img.png&quot; data-alt=&quot;config 세팅 파일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xXNZb/btsH51paQCP/W3N6X59XxJgNXIKMEEhv2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxXNZb%2FbtsH51paQCP%2FW3N6X59XxJgNXIKMEEhv2K%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;216&quot; height=&quot;215&quot; data-origin-width=&quot;216&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;config 세팅 파일&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;위 사진처럼 base.py, dev, production.py로 운영 환경마다 필요한 세팅파일을 나누었음.&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: #f8f840; color: #000000; text-align: start;&quot;&gt;--settings=config.settings.dev&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;옵션을 추가해서 테스트를 했는데 문제가 없었음.&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;color: #000000; text-align: start;&quot;&gt;But, &lt;span style=&quot;background-color: #f8f840; color: #000000; text-align: start;&quot;&gt;set DJANGO_SETTINGS_MODULE=config.settings.dev&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 명령어를 통해 환경 변수를 등록해 서버 구동 시에 매번 옵션을 추가하지 않도록 하려던 중 문제점 발생!!&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&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위 명령어로 환경 변수를 등록했음에도 서버를 구동할 때&amp;nbsp;&lt;/span&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;46&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/67Usk/btsH5N5GlOk/vKTx7ahEGvg1e0BTPwte51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/67Usk/btsH5N5GlOk/vKTx7ahEGvg1e0BTPwte51/img.png&quot; data-alt=&quot;서버 구동 시 에러 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/67Usk/btsH5N5GlOk/vKTx7ahEGvg1e0BTPwte51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F67Usk%2FbtsH5N5GlOk%2FvKTx7ahEGvg1e0BTPwte51%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;551&quot; height=&quot;46&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;46&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;p data-ke-size=&quot;size16&quot;&gt;settings.py 파일을 찾을 수 없다는 에러가 뜸.. &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;옵션을 추가해서 서버를 구동시킬 땐 원하는 세팅 파일로 설정이 되는데 환경 변수로 설정할 때만 안 되는 것이 이해가 되지 않았음..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;manage.py 파일에서&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.dev')&lt;/code&gt;&lt;/pre&gt;
&lt;/div&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;실제로 서버가 구동이 되었지만 환경 변수 설정이랑 별개로 manage.py에서 선언한 dev.py로만 설정이 됨.&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;(나중에 찾아본 바로 서버 구동 시 manage.py 파일을 기반으로 되기때문에 별도로 설정된 환경변수나 옵션이 없으면 manage.py 에 설정된 대로 세팅이 실행됨)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt; ️ &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;해결책&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;blockquote data-ke-style=&quot;style3&quot;&gt;echo %DJANGO_SETTINGS_MODULE%&amp;nbsp; &amp;nbsp; //환경 변수가 제대로 설정되었는지 확인하는 명령어&lt;/blockquote&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;41&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JeraL/btsH5zGLPPN/5Z1MQ29ciw1RUJpipUXPmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JeraL/btsH5zGLPPN/5Z1MQ29ciw1RUJpipUXPmK/img.png&quot; data-alt=&quot;명령어 실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JeraL/btsH5zGLPPN/5Z1MQ29ciw1RUJpipUXPmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJeraL%2FbtsH5zGLPPN%2F5Z1MQ29ciw1RUJpipUXPmK%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;470&quot; height=&quot;41&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;41&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;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;/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;필자는 Window PowerShell에서 작업 중이었는데 파워 쉘에서의 명령어는 이런 식이었음.&lt;/p&gt;
&lt;pre id=&quot;code_1718870453384&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$env:DJANGO_SETTINGS_MODULE = &quot;config.settings.dev&quot;	//환경 변수 설정 명령어
echo $env:DJANGO_SETTINGS_MODULE			//잘 적용되었는지 확인 명령어&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;원래 적용했던 명령어는 Commend Prompt에서 사용하면 적용이 가능함!!&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;</description>
      <category>개발자 모드/오류처리</category>
      <category>Django</category>
      <category>settings</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/53</guid>
      <comments>https://precious-value.tistory.com/53#entry53comment</comments>
      <pubDate>Thu, 20 Jun 2024 17:07:32 +0900</pubDate>
    </item>
    <item>
      <title>[Spring]JDBC, SQL Mapper, ORM이란?(feat. JPA, Mybatis)</title>
      <link>https://precious-value.tistory.com/52</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;(※주의/참고 필자가 공부한 내용을 바탕으로 포스팅을 하기 때문에 틀린 부분이 있을 수 있음!!!)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;  목차&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;1. JDBC란 무엇인가?&lt;br /&gt;2. SQL Mapper란 무엇인가?&lt;br /&gt;3. ORM이란 무엇인가?&lt;br /&gt;&amp;nbsp; - Hibernate, JPA는 무엇인가?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 개념에 대해서 설명하기 앞서 JDBC, SQL Mapper, ORM과 같은 프레임워크나 API들이 나타난 배경은 무엇일까??&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;예를 들어 스프링으로 웹 애플리케이션을 만들었을 때 관계형 데이터베이스가 없다면 어떻게 될까??&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;이때까지 저장한 데이터, 즉 객체의 상태가 사라지게 됨. &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;span style=&quot;color: #009a87;&quot;&gt;데이터를 생성한 프로그램이 종료되더라도 데이터를 사라지지 않게(영속성)&lt;/span&gt;&lt;/b&gt; 하기 위해서 DB에 데이터를 저장하고 영속성을 부여하여 상태를 유지할 수 있도록 함.&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와 연결되어 데이터를 주고 받을 수 있도록 하기 위해 Java에서 제공하는 API JDBC(Java Database Connectivity)가 등장함.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;1. What is JDBC?&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 설명하자면 JDBC는 자바 프로그램이 DB와 소통할 수 있게 해주는 일종의 &quot;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;전화기&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&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;자바 코드에서 SQL 쿼리를 작성하고, DB로 보내 데이터를 받을 수 있음.&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;JDBC는 자바 애플리케이션에서 DBMS의 종류에 상관 없이, 하나의 JDBC API를 통해 DB작업을 처리하고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;제목 없는 다이어그램.jpg&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rJuWk/btsHAK8hBdg/C1Q9VhFqH8f7iqSfjMxsW1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rJuWk/btsHAK8hBdg/C1Q9VhFqH8f7iqSfjMxsW1/img.jpg&quot; data-alt=&quot;JDBC 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rJuWk/btsHAK8hBdg/C1Q9VhFqH8f7iqSfjMxsW1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrJuWk%2FbtsHAK8hBdg%2FC1Q9VhFqH8f7iqSfjMxsW1%2Fimg.jpg&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;343&quot; height=&quot;592&quot; data-filename=&quot;제목 없는 다이어그램.jpg&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;JDBC 구조&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에 따라 JDBC Driver만 바꾸면 어느 DB에서든 접근할 수 있음.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;하지만 JDBC는 DB 연결, SQL 실행, 결과 처리 등의 작업을 매번 직접 작성해야 하므로, 반복적인 코드가 많아&amp;nbsp;코드가 길어지고 그만큼 시간도 더 소요됨.&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;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt; &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;JDBC의 장단점&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. 장점&lt;br /&gt;&amp;nbsp;- JDBC드라이버로 거의 모든 DB에 접근하는 것이 가능함(범용성)&lt;br /&gt;&amp;nbsp;- SQL 쿼리, DB 연결, 트랜잭션 관리 등을 직접 제어가 가능(세밀한 제어)&lt;br /&gt;&lt;br /&gt;2. 단점&lt;br /&gt;&amp;nbsp;- 매번 DB 연결과 자원 해제를 위한 코드를 작성해야함.(반복적인 코드)&lt;br /&gt;&amp;nbsp;- 결과로 받은 데이터를 직접 객체에 일일이 넣어줘야함.(수동적인 매핑)&lt;br /&gt;&amp;nbsp;- 비지니스 로직에 집중하기보단 SQL 의존적인 개발을 해야 함.&lt;br /&gt;&amp;nbsp;- connection, resultset 등 공유 자원을 매번 반환(해제) 해야 함.&lt;/blockquote&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와 소통할 수 있는 시스템을 개발하였는데 그것이 바로 &lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;Persistence Framework&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;&amp;gt;&amp;gt; &lt;span style=&quot;color: #8a3db6;&quot;&gt;JDBC를 직접 이용하지 않고 데이터베이스와의 연동되는 시스템을 빠르게 개발, 안정적인 구동을 보장해 주는 프레임워크&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;종류는 DB와 매핑하는 방식에 따라 &lt;b&gt;&lt;span style=&quot;color: #953b34;&quot;&gt;SQL Mapper&lt;/span&gt;&lt;/b&gt;와 &lt;b&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;ORM&lt;/span&gt;&lt;/b&gt;으로 나뉨.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #953b34;&quot;&gt;&lt;b&gt;2. What is SQL Mapper?&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL Mapper란 SQL 문과 객체의 필드를 매핑하여 데이터를 객체화하는 기술로, 객체와 관계를 매핑하는 것이 아니라&amp;nbsp;작성한 SQL 문의 결과와 객체의 필드를 매핑하여 데이터를 객체화하는 것.&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;조금 더 쉽게 설명하자면 자바 코드와 SQL 쿼리를 연결해 주는 &quot;&lt;b&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;통역사&lt;/span&gt;&lt;/b&gt;&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;대표적인 프레임워크로 Mybatis가 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt; ️&lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;Mybatis&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;- 자바 애플리케이션에서 SQL 쿼리를 쉽게 작성하고 실행할 수 있도록 도와주는 Persistence Framework&lt;br /&gt;&lt;br /&gt;1. 장점&lt;br /&gt;&amp;nbsp;- 자바 코드로부터 SQL 쿼리문을 따로 XML파일로 관리(비즈니스 로직에 집중)&lt;br /&gt;&amp;nbsp;- SQL 쿼리를 직접 작성하고 관리할 수 있고 복잡한 쿼리문 작성에 유리함(SQL 제어)&lt;br /&gt;&amp;nbsp;- 간단한 설정으로 DB와 연동을 쉽게 설정할 수 있음(간편한 설정)&lt;br /&gt;&lt;br /&gt;2. 단점&lt;br /&gt;&amp;nbsp;- SQL 결과를 자바 객체로 수동으로 매핑해야 하므로 추후 DB 테이블 컬럼이 추가될 때 직접 쿼리문을 수정해야 함 (매핑 작업)&lt;br /&gt;&amp;nbsp;- SQL 쿼리를 직접 작성해야 하므로 쿼리문법을 모른다면 어려움이 있음(러닝커브)&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;3. What is ORM?&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ORM(Object-Relational Mapping)은 객체와 관계형 데이터베이스를 매핑하는 것으로, 쉽게 말해 DB 테이블을 자바 객체로 만들어주는 &quot;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;자동 번역기&lt;/b&gt;&lt;/span&gt;&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;ORM을 사용하면 패러다임 불일치를 해결할 수 있으며, 개발자가 SQL 쿼리문을 직접 작성하지 않아도 됨.&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;그렇기 때문에 비지니스 로직에 더 집중할 수 있고, CRUD 쿼리문의 반복을 줄일 수 있음.&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;대표적인 프레임워크로는 JPA, Hibernate 등이 있음.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt; ️&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;JPA&lt;br /&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 자바 표준 API로, 관계형 데이터베이스와 자바 객체 간의 매핑을 위한 표준 인터페이스를 제공&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- JPA를 사용하면 개발자는 객체 지향적인 방식으로 데이터베이스와 상호작용을 할 수 있음&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 자바 표준 API이기 때문에 여러 구현체에서 사용할 수 있음&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;gt; 대표적인 구현체로 Hibernate가 있음&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt; ️&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;Hibernate&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- Hibernate는 JPA 스펙을 구현한 ORM 프레임워크 중 하나로 객체-관계 매핑을 위한 다양한 기능을 제공하며 대부분의 JPA 기능을 포함하고 있음.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 쉽게 말해 JPA에서 메소드로 요청된 정보들을 JDBC가 잘 알아들을 수 있도록 한번 더 표준화 작업을 해주고 JDBC로 넘겨줌.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- &lt;span style=&quot;text-align: left;&quot;&gt;캐싱, 지연 로딩 등의 기능을 제공하여 성능 최적화를 지원함.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&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;&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;a href=&quot;https://www.youtube.com/watch?v=VTqqZSuSdOk&amp;amp;t=568s&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=VTqqZSuSdOk&amp;amp;t=568s&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dev-coco.tistory.com/76&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dev-coco.tistory.com/76&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://brightstarit.tistory.com/20&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://brightstarit.tistory.com/20&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@murphytklee/Spring-ORM-JPA-Hibernate-JDBC-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@murphytklee/Spring-ORM-JPA-Hibernate-JDBC-%EC%B4%9D%EC%A0%95%EB%A6%AC&lt;/a&gt;&lt;/p&gt;</description>
      <category>개발자 모드/개념</category>
      <category>JDBC</category>
      <category>jpa</category>
      <category>myBatis</category>
      <category>orm</category>
      <category>SQLMapper</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/52</guid>
      <comments>https://precious-value.tistory.com/52#entry52comment</comments>
      <pubDate>Sun, 26 May 2024 19:29:07 +0900</pubDate>
    </item>
    <item>
      <title>[Bat] 배치 파일로 간단하게 JDK 버전 전환하기!</title>
      <link>https://precious-value.tistory.com/51</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;  글을 쓰게 된 계기&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평소 사용하던 JDK 버전은 1.8인데 지오서버를 세팅하면서 JDK 11으로 변경해야 할 일이 생김.&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; BAT 파일을 만들어 환경변수에 등록하고 간단한 명령어로&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;JDK 버전을 바꿀 수 있도록 하고자 글을 작성함.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;1. 배치 파일 작성&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배치 파일을 작성하기 전!! 당연히 사용할 Open JDK는 환경변수로 등록이 되어 있어야 함!!&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;&lt;a href=&quot;https://precious-value.tistory.com/50&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.04.04 - [개발자 모드/개념] - [Java] Open JDK 설치 및 환경 변수 설정&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1712218269011&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Java] Open JDK 설치 및 환경 변수 설정&quot; data-og-description=&quot;  글을 쓰게 된 계기 Java를 사용하면서 환경변수 설정은 필수적이기에 기초 환경 세팅 방법을 복기하고자 글을 작성함. # JDK란? JDK(Java Development Kit)는 Java 언어로 소프트웨어를 개발하는 데 필&quot; data-og-host=&quot;precious-value.tistory.com&quot; data-og-source-url=&quot;https://precious-value.tistory.com/50&quot; data-og-url=&quot;https://precious-value.tistory.com/50&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kenDP/hyVJVO14pZ/zGumhCfbj5FS4WOir5OHj1/img.png?width=719&amp;amp;height=701&amp;amp;face=0_0_719_701,https://scrap.kakaocdn.net/dn/bbnpPw/hyVJYSwO6m/qukEmB77AGoz61EZslF9Vk/img.png?width=719&amp;amp;height=701&amp;amp;face=0_0_719_701,https://scrap.kakaocdn.net/dn/cXtZ85/hyVJSSjuzj/oi0xdNB0Lc5c1axxxARlnK/img.jpg?width=2560&amp;amp;height=2560&amp;amp;face=0_0_2560_2560&quot;&gt;&lt;a href=&quot;https://precious-value.tistory.com/50&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://precious-value.tistory.com/50&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kenDP/hyVJVO14pZ/zGumhCfbj5FS4WOir5OHj1/img.png?width=719&amp;amp;height=701&amp;amp;face=0_0_719_701,https://scrap.kakaocdn.net/dn/bbnpPw/hyVJYSwO6m/qukEmB77AGoz61EZslF9Vk/img.png?width=719&amp;amp;height=701&amp;amp;face=0_0_719_701,https://scrap.kakaocdn.net/dn/cXtZ85/hyVJSSjuzj/oi0xdNB0Lc5c1axxxARlnK/img.jpg?width=2560&amp;amp;height=2560&amp;amp;face=0_0_2560_2560');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Java] Open JDK 설치 및 환경 변수 설정&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  글을 쓰게 된 계기 Java를 사용하면서 환경변수 설정은 필수적이기에 기초 환경 세팅 방법을 복기하고자 글을 작성함. # JDK란? JDK(Java Development Kit)는 Java 언어로 소프트웨어를 개발하는 데 필&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;precious-value.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;Open JDK를 설치한 경로에 scripts라는 폴더를 만들어주고 그 안에 배치 파일을 버전별로 넣어줄 예정.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712218651318&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@echo off
set JAVA_HOME={JDK 주소}
set Path=%JAVA_HOME%\bin;%Path%
echo Java 8 activated.&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;파일명은 자유지만 간단하게 저는 java8.bat / java11.bat 로 작성함.&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;위 코드에서 JDK 주소만 변경해서 배치파일을 작성하면 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vEu9c/btsGldMlPuu/8IZSqK82V9a5ZbVzsR4dp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vEu9c/btsGldMlPuu/8IZSqK82V9a5ZbVzsR4dp0/img.png&quot; data-alt=&quot;JDK11 배치파일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vEu9c/btsGldMlPuu/8IZSqK82V9a5ZbVzsR4dp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvEu9c%2FbtsGldMlPuu%2F8IZSqK82V9a5ZbVzsR4dp0%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; alt=&quot;JDK11 배치파일&quot; loading=&quot;lazy&quot; width=&quot;435&quot; height=&quot;86&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;JDK11 배치파일&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;이렇게 작성 후 저장! JDK 8도 마찬가지로 작성 후 저장하고 scripts 폴더 안으로 넣어 주면 됨.&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;C: 드라이브 안에서 파일을 만들 땐 권한 문제로 폴더밖에 생성이 안 되는 듯하니&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;160&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDhdEn/btsGlRPKG81/WewTL62WiWeLVdK2nmpj4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDhdEn/btsGlRPKG81/WewTL62WiWeLVdK2nmpj4K/img.png&quot; data-alt=&quot;JDK 경로&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDhdEn/btsGlRPKG81/WewTL62WiWeLVdK2nmpj4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDhdEn%2FbtsGlRPKG81%2FWewTL62WiWeLVdK2nmpj4K%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; alt=&quot;JDK 경로&quot; loading=&quot;lazy&quot; width=&quot;160&quot; height=&quot;116&quot; data-origin-width=&quot;160&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;JDK 경로&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;배치 파일까지 작성을 완료했다면 이제 scripts 폴더를 환경 변수에 추가만 하면 됨.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;2. 환경 변수 설정&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;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;gt; Path 변수를 편집!!&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;환경 변수 편집 창에서 새로 만들기 버튼 클릭 후 scripts 폴더 경로를 입력해 주고 확인하면 끝!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEILeF/btsGn7XO5gd/1cYvBTtgYG2Wr8nxciNEcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEILeF/btsGn7XO5gd/1cYvBTtgYG2Wr8nxciNEcK/img.png&quot; data-alt=&quot;환경 변수 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEILeF/btsGn7XO5gd/1cYvBTtgYG2Wr8nxciNEcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEILeF%2FbtsGn7XO5gd%2F1cYvBTtgYG2Wr8nxciNEcK%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; alt=&quot;환경 변수 설정&quot; loading=&quot;lazy&quot; width=&quot;513&quot; height=&quot;484&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;484&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;p data-ke-size=&quot;size16&quot;&gt;환경 변수 설정이 완료되었다면 cmd 창을 열어서 확인해 보기!&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;java8 or java11을 입력했을 때&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;138&quot; data-origin-height=&quot;23&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHlT7B/btsGle5xhmP/OgklAKU51MEL7G7ZdlGO1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHlT7B/btsGle5xhmP/OgklAKU51MEL7G7ZdlGO1K/img.png&quot; data-alt=&quot;입력 후 창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHlT7B/btsGle5xhmP/OgklAKU51MEL7G7ZdlGO1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHlT7B%2FbtsGle5xhmP%2FOgklAKU51MEL7G7ZdlGO1K%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; alt=&quot;입력 후 창&quot; loading=&quot;lazy&quot; width=&quot;138&quot; height=&quot;23&quot; data-origin-width=&quot;138&quot; data-origin-height=&quot;23&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;이렇게 아까 배치파일에 설정했던 대로 뜨면 완료!&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;java -version 명령어를 사용하여 버전이 변경되었는지 확인하면 됨!!&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;혹시 매번 버전 확인하기 귀찮다면 배치파일 맨 하단에 java -version을 추가하면&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;&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;a href=&quot;https://computer-science-student.tistory.com/467&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://computer-science-student.tistory.com/467&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1712219612103&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[자바, Java] 설치한 여러 JDK 간편하게 전환&quot; data-og-description=&quot;Java 설치한 여러 JDK 간편하게 전환 설치한 여러개의 JDK를 매번 설정을 바꾸지 않고 cmd에서 간단하게 명령어를 입력해 변경해주는 방법에 대해 정리하고자 한다. 이때, 기본적으로 자바 환경변수&quot; data-og-host=&quot;computer-science-student.tistory.com&quot; data-og-source-url=&quot;https://computer-science-student.tistory.com/467&quot; data-og-url=&quot;https://computer-science-student.tistory.com/467&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bHUamP/hyVJUvQeOf/DY0Cemfjcn68Kjc06vSJsk/img.png?width=267&amp;amp;height=117&amp;amp;face=0_0_267_117,https://scrap.kakaocdn.net/dn/Q74UN/hyVJ46hQXH/zuFtLkvkp4BHWCPkcIO4b1/img.png?width=267&amp;amp;height=117&amp;amp;face=0_0_267_117,https://scrap.kakaocdn.net/dn/QGYif/hyVJ3lZsX5/Q7KD0fz9oEXOb7Rfa8KvE0/img.jpg?width=588&amp;amp;height=588&amp;amp;face=0_0_588_588&quot;&gt;&lt;a href=&quot;https://computer-science-student.tistory.com/467&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://computer-science-student.tistory.com/467&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bHUamP/hyVJUvQeOf/DY0Cemfjcn68Kjc06vSJsk/img.png?width=267&amp;amp;height=117&amp;amp;face=0_0_267_117,https://scrap.kakaocdn.net/dn/Q74UN/hyVJ46hQXH/zuFtLkvkp4BHWCPkcIO4b1/img.png?width=267&amp;amp;height=117&amp;amp;face=0_0_267_117,https://scrap.kakaocdn.net/dn/QGYif/hyVJ3lZsX5/Q7KD0fz9oEXOb7Rfa8KvE0/img.jpg?width=588&amp;amp;height=588&amp;amp;face=0_0_588_588');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[자바, Java] 설치한 여러 JDK 간편하게 전환&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Java 설치한 여러 JDK 간편하게 전환 설치한 여러개의 JDK를 매번 설정을 바꾸지 않고 cmd에서 간단하게 명령어를 입력해 변경해주는 방법에 대해 정리하고자 한다. 이때, 기본적으로 자바 환경변수&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;computer-science-student.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 모드/응용</category>
      <category>배치파일로 JDK 버전변경</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/51</guid>
      <comments>https://precious-value.tistory.com/51#entry51comment</comments>
      <pubDate>Thu, 4 Apr 2024 17:31:38 +0900</pubDate>
    </item>
    <item>
      <title>[Java] Open JDK 설치 및 환경 변수 설정</title>
      <link>https://precious-value.tistory.com/50</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;  글을 쓰게 된 계기&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java를 사용하면서 환경변수 설정은 필수적이기에 기초 환경 세팅 방법을 복기하고자 글을 작성함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;# JDK란?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;JDK(Java Development Kit)는 Java 언어로 소프트웨어를 개발하는 데 필요한 도구들을 제공하는 개발 키트입니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;1. Open JDK 설치&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Open JDK도 종류가 다양한데 그중 오라클에서 제공하는 Open JDK를 설치하였음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jdk.java.net/java-se-ri/11-MR2&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jdk.java.net/java-se-ri/11-MR2&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1712216447352&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Java Platform, Standard Edition 11 Reference
Implementations&quot; data-og-description=&quot;Java Platform, Standard Edition 11 Reference Implementations The official Reference Implementation for Java SE&amp;nbsp;11 (JSR&amp;nbsp;384) is based solely upon open-source code available from the JDK&amp;nbsp;11 Project in the OpenJDK Community. This Reference Implementation a&quot; data-og-host=&quot;jdk.java.net&quot; data-og-source-url=&quot;https://jdk.java.net/java-se-ri/11-MR2&quot; data-og-url=&quot;https://jdk.java.net/java-se-ri/11-MR2&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://jdk.java.net/java-se-ri/11-MR2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jdk.java.net/java-se-ri/11-MR2&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Java Platform, Standard Edition 11 Reference Implementations&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Java Platform, Standard Edition 11 Reference Implementations The official Reference Implementation for Java SE&amp;nbsp;11 (JSR&amp;nbsp;384) is based solely upon open-source code available from the JDK&amp;nbsp;11 Project in the OpenJDK Community. This Reference Implementation a&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jdk.java.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;701&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vql8B/btsGlvTCwB1/ThV8XuxeN9nVJgeLIFrXC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vql8B/btsGlvTCwB1/ThV8XuxeN9nVJgeLIFrXC1/img.png&quot; data-alt=&quot;오라클 OpenJDK 다운로드 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vql8B/btsGlvTCwB1/ThV8XuxeN9nVJgeLIFrXC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVql8B%2FbtsGlvTCwB1%2FThV8XuxeN9nVJgeLIFrXC1%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; alt=&quot;오라클 OpenJDK 다운로드 화면&quot; loading=&quot;lazy&quot; width=&quot;443&quot; height=&quot;432&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;701&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;오라클 OpenJDK 다운로드 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측 메뉴에서 원하는 버전을 선택 후 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;위 링크를 클릭하면&lt;/span&gt;&amp;nbsp;ZIP파일을 다운로드 받을 수 있고 원하는 위치에 압축을 풀면 됨!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2. 환경 변수 설정&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;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;그러면 환경 변수 창이 뜨는데 밑의 시스템 변수에서 새로 만들기 버튼 클릭!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;424&quot; data-origin-height=&quot;185&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WChwg/btsGlRPGKc7/cIwkLrkBLncoYqX3iCWUnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WChwg/btsGlRPGKc7/cIwkLrkBLncoYqX3iCWUnk/img.png&quot; data-alt=&quot;시스템 변수 창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WChwg/btsGlRPGKc7/cIwkLrkBLncoYqX3iCWUnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWChwg%2FbtsGlRPGKc7%2FcIwkLrkBLncoYqX3iCWUnk%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; alt=&quot;시스템 변수&quot; loading=&quot;lazy&quot; width=&quot;424&quot; height=&quot;185&quot; data-origin-width=&quot;424&quot; data-origin-height=&quot;185&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;p data-ke-size=&quot;size16&quot;&gt;변수 이름은 JAVA_HOME&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수 값은 일전에 Open JDK 설치 경로인 C:\Program&amp;nbsp;Files\Java\jdk-11.0.0.1&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;JAVA_HOME이라는 변수를 추가했으면 변수 이름이 PATH인 것을 찾아서 편집 클릭!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7JZta/btsGmz8QmO6/Jx3kzX4j0IKuj2twvnEem0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7JZta/btsGmz8QmO6/Jx3kzX4j0IKuj2twvnEem0/img.png&quot; data-alt=&quot;환경 변수 편집&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7JZta/btsGmz8QmO6/Jx3kzX4j0IKuj2twvnEem0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7JZta%2FbtsGmz8QmO6%2FJx3kzX4j0IKuj2twvnEem0%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; alt=&quot;환경 변수 편집&quot; loading=&quot;lazy&quot; width=&quot;515&quot; height=&quot;488&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;488&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;새로 만들기 버튼 클릭 후 위와 같이 % JAVA_HOME%\bin을 추가 후 확인하면 끝!&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;gt;명령 프롬프트를 실행시켜 java -version 명령어를 치면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;53&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llvd5/btsGntUDtQw/oFQdQrgMNCnRNLBJ4XaNL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llvd5/btsGntUDtQw/oFQdQrgMNCnRNLBJ4XaNL0/img.png&quot; data-alt=&quot;java 버전 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llvd5/btsGntUDtQw/oFQdQrgMNCnRNLBJ4XaNL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fllvd5%2FbtsGntUDtQw%2FoFQdQrgMNCnRNLBJ4XaNL0%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; alt=&quot;java 버전 확인&quot; loading=&quot;lazy&quot; width=&quot;528&quot; height=&quot;53&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;53&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;java 버전 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 뜨는 것을 확인! 끝!!  &lt;/p&gt;</description>
      <category>개발자 모드/개념</category>
      <category>JAVA 환경변수 설정</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/50</guid>
      <comments>https://precious-value.tistory.com/50#entry50comment</comments>
      <pubDate>Thu, 4 Apr 2024 16:53:20 +0900</pubDate>
    </item>
    <item>
      <title>[백엔드 아키텍처] 계층 구조 vs 도메인 구조에 대한 고민</title>
      <link>https://precious-value.tistory.com/49</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;1. 글을 쓰게 된 계기&lt;/b&gt;&lt;/blockquote&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;어떤 식으로 아키텍쳐 구조를 만들어야 개발하는 입장에서도 접근하기 쉽고&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;blockquote data-ke-style=&quot;style3&quot;&gt;# 잠깐! &lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;계층 구조와 도메인 구조의 장단점&lt;/b&gt; &lt;/span&gt;알고가기&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;1. 계층 구조&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;* 장점&lt;/b&gt;&lt;br /&gt;&amp;nbsp;- 패키지 구조만 보고 전체적인 구조를 파악하기 쉽기 때문에 작은 프로젝트나 도메인 개수가 적을 때 사용&lt;br /&gt;&amp;nbsp;- 예를 들어 서비스 로직에 대한 기능 수정이 있을 땐 서비스 패키지만 확인하면 됨. &amp;gt; 해당되는 패키지만 확인&lt;br /&gt;&lt;br /&gt;&lt;b&gt;* 단점&lt;/b&gt;&lt;br /&gt;&amp;nbsp;- 한 패키지 안의 클래스 파일들이 많이 모이게 되어 복잡해지고 관리하기 힘들어짐.&lt;br /&gt;&amp;nbsp;- 추후 기능 수정으로 인한 모듈 단위로 분리하는데 어려움이 있음.&amp;nbsp;&lt;br /&gt;&amp;nbsp;- 도메인별 응집도가 낮음.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #953b34;&quot;&gt;&lt;b&gt;2. 도메인 구조&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;* 장점&lt;/b&gt;&lt;br /&gt;&amp;nbsp;- 도메인 별로 패키지를 분리하여 계층형 방식보다 관리가 직관적임.&lt;br /&gt;&amp;nbsp;- 각각의 도메인들은 서로를 의존하는 코드가 없도록 설계하기 적합해서 코드의 재활용성이 향상됨.&lt;br /&gt;&amp;nbsp;- 모듈 단위로 분리하기가 계층 구조보다 쉬움.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;* 단점&lt;/b&gt;&lt;br /&gt;&amp;nbsp;- 애플리케이션의 전체적인 흐름을 파악하기 힘듦.&lt;br /&gt;&amp;nbsp;- 개발자마다 도메인에 대한 기준이 다르기 때문에 패키지 구조를 나누는 기준이 애매하고 예상과 다른 패키지에 존재할 수 있음.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;2. 기존 프로젝트 문제점 인식&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;기존 프로젝트는 메뉴 별 계층 구조를 사용하고 있었고&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 컨트롤러에서 서비스 로직이나 vo와 같은 다른 클래스를 찾는 데도 시간이 오래 걸리는 단점들이 보였음.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;157&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pRThR/btsGfimBich/Fra6ZKJ5tYzW24Du3nOv51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pRThR/btsGfimBich/Fra6ZKJ5tYzW24Du3nOv51/img.png&quot; data-alt=&quot;기존 디렉토리 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pRThR/btsGfimBich/Fra6ZKJ5tYzW24Du3nOv51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpRThR%2FbtsGfimBich%2FFra6ZKJ5tYzW24Du3nOv51%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;157&quot; height=&quot;315&quot; data-origin-width=&quot;157&quot; data-origin-height=&quot;315&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;3. 문제점 개선을 위한 해결 방안&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;단, 메뉴별 도메인 구조로 아키텍처를 구축함.&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;제목 없음.png&quot; data-origin-width=&quot;171&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d4ejb7/btsGhVK21Ij/dP5t3Rx3XrZaSi1XvLbKd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d4ejb7/btsGhVK21Ij/dP5t3Rx3XrZaSi1XvLbKd1/img.png&quot; data-alt=&quot;변경된 디렉토리 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d4ejb7/btsGhVK21Ij/dP5t3Rx3XrZaSi1XvLbKd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4ejb7%2FbtsGhVK21Ij%2FdP5t3Rx3XrZaSi1XvLbKd1%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;171&quot; height=&quot;294&quot; data-filename=&quot;제목 없음.png&quot; data-origin-width=&quot;171&quot; data-origin-height=&quot;294&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;4. 생각 및 느낀 점&lt;/b&gt;&lt;/blockquote&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;하지만 분명 디렉터리 구조는 추후 유지보수뿐만 아니라 당장 개발할 때도 연관이 있는 중요한 부분이라는 것을 한번 더 깨닫게 되었음.&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;작은 프로젝트라면 어떤 구조던지 크게 문제는 없겠지만 시스템이 커지고 서비스 로직이 많아질수록 백엔드 아키텍처에&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;a href=&quot;https://velog.io/@jmjmjmz732002/Springboot-directory-%EA%B5%AC%EC%A1%B0-%EA%B3%84%EC%B8%B5%ED%98%95%EA%B3%BC-%EB%8F%84%EB%A9%94%EC%9D%B8%ED%98%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@jmjmjmz732002/Springboot-directory-%EA%B5%AC%EC%A1%B0-%EA%B3%84%EC%B8%B5%ED%98%95%EA%B3%BC-%EB%8F%84%EB%A9%94%EC%9D%B8%ED%98%95&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1712034848120&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Springboot] directory 구조 : 계층형과 도메인형&quot; data-og-description=&quot;양자택일 극단적이야 넌&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@jmjmjmz732002/Springboot-directory-%EA%B5%AC%EC%A1%B0-%EA%B3%84%EC%B8%B5%ED%98%95%EA%B3%BC-%EB%8F%84%EB%A9%94%EC%9D%B8%ED%98%95&quot; data-og-url=&quot;https://velog.io/@jmjmjmz732002/Springboot-directory-구조-계층형과-도메인형&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/crczu8/hyVGHYzWKE/VG32ZFonRRRvdk02tDtm6K/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/Nx3nm/hyVGFfoEM9/xs8uwuR3cgJpH8ZwoNrFtk/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/bgmOLF/hyVJ4xOSMr/HUnOUQ45RkKR7oqs1t1MJ1/img.jpg?width=1200&amp;amp;height=1543&amp;amp;face=482_298_846_695&quot;&gt;&lt;a href=&quot;https://velog.io/@jmjmjmz732002/Springboot-directory-%EA%B5%AC%EC%A1%B0-%EA%B3%84%EC%B8%B5%ED%98%95%EA%B3%BC-%EB%8F%84%EB%A9%94%EC%9D%B8%ED%98%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@jmjmjmz732002/Springboot-directory-%EA%B5%AC%EC%A1%B0-%EA%B3%84%EC%B8%B5%ED%98%95%EA%B3%BC-%EB%8F%84%EB%A9%94%EC%9D%B8%ED%98%95&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/crczu8/hyVGHYzWKE/VG32ZFonRRRvdk02tDtm6K/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/Nx3nm/hyVGFfoEM9/xs8uwuR3cgJpH8ZwoNrFtk/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/bgmOLF/hyVJ4xOSMr/HUnOUQ45RkKR7oqs1t1MJ1/img.jpg?width=1200&amp;amp;height=1543&amp;amp;face=482_298_846_695');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Springboot] directory 구조 : 계층형과 도메인형&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;양자택일 극단적이야 넌&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@syb0228/%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%ED%8C%A8%ED%82%A4%EC%A7%80-%EA%B5%AC%EC%A1%B0-%EA%B3%84%EC%B8%B5%ED%98%95-vs-%EB%8F%84%EB%A9%94%EC%9D%B8%ED%98%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@syb0228/%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%ED%8C%A8%ED%82%A4%EC%A7%80-%EA%B5%AC%EC%A1%B0-%EA%B3%84%EC%B8%B5%ED%98%95-vs-%EB%8F%84%EB%A9%94%EC%9D%B8%ED%98%95&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1712034851404&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;아키텍처 패키지 구조 : 계층형 vs 도메인형&quot; data-og-description=&quot;1. 계층형 구조 애플리케이션에서 사용하는 계층별로 패키지를 구성하는 방법 Layered Architecture의 컴포넌트 및 관련 요소들이 패키지가 되는 경우가 많음 장점 프로젝트에 대한 이해도가 상대적&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@syb0228/%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%ED%8C%A8%ED%82%A4%EC%A7%80-%EA%B5%AC%EC%A1%B0-%EA%B3%84%EC%B8%B5%ED%98%95-vs-%EB%8F%84%EB%A9%94%EC%9D%B8%ED%98%95&quot; data-og-url=&quot;https://velog.io/@syb0228/아키텍처-패키지-구조-계층형-vs-도메인형&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/j7oh1/hyVJSRGKWo/Ky1M2nD7SZwhRrqp1JFJkk/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500&quot;&gt;&lt;a href=&quot;https://velog.io/@syb0228/%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%ED%8C%A8%ED%82%A4%EC%A7%80-%EA%B5%AC%EC%A1%B0-%EA%B3%84%EC%B8%B5%ED%98%95-vs-%EB%8F%84%EB%A9%94%EC%9D%B8%ED%98%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@syb0228/%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%ED%8C%A8%ED%82%A4%EC%A7%80-%EA%B5%AC%EC%A1%B0-%EA%B3%84%EC%B8%B5%ED%98%95-vs-%EB%8F%84%EB%A9%94%EC%9D%B8%ED%98%95&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/j7oh1/hyVJSRGKWo/Ky1M2nD7SZwhRrqp1JFJkk/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;아키텍처 패키지 구조 : 계층형 vs 도메인형&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. 계층형 구조 애플리케이션에서 사용하는 계층별로 패키지를 구성하는 방법 Layered Architecture의 컴포넌트 및 관련 요소들이 패키지가 되는 경우가 많음 장점 프로젝트에 대한 이해도가 상대적&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 모드/개념</category>
      <category>계층구조vs도메인구조</category>
      <category>백엔드 아키텍처</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/49</guid>
      <comments>https://precious-value.tistory.com/49#entry49comment</comments>
      <pubDate>Tue, 2 Apr 2024 14:14:58 +0900</pubDate>
    </item>
    <item>
      <title>DB 조회는 최소한으로!</title>
      <link>https://precious-value.tistory.com/48</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;  글을 쓰게 된 계기(문제 발견)&lt;/b&gt;&lt;/blockquote&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;그런데!! 건수가 2만 건 정도 되는데 10초 넘게 걸림. &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;확인 결과  &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;엑셀 만들기 전에 데이터를 변환하는 과정이 있었는데 그 과정에서 문제가 있었음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;  &lt;b&gt;해결과정&lt;/b&gt;&lt;/blockquote&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;pre id=&quot;code_1710382184840&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//기존 코드
Field[] fields = target.getClass().getDeclaredFields();
for (Field field : fields
) {
	field.setAccessible(true);  //접근 권한 변경
	if(field.get(target) != null){
		switch (field.getName()) {
			case &quot;aCde&quot;:
				setCode1(&quot;detail&quot;,ftrcList,field,target);
				break;
			case &quot;bCde&quot;:
				setCode2(&quot;detail&quot;,hjdList,field,target);
				break;
			case &quot;cCde&quot;:
				setCode3(&quot;detail&quot;,bjdList,field,target);
				break;
			case &quot;dCde&quot;:
				setCode4(&quot;detail&quot;,mngrList,field,target);
				break;
			case &quot;eCde&quot;:
			case &quot;fCde&quot;:
			case &quot;gCde&quot;: 
			case &quot;hCde&quot;:
			case &quot;iCde&quot;: 
            	//문제 발생 지점
				rdCodeList = codeService.getOtherCodeListToExcel(new ArrayList&amp;lt;&amp;gt;(Arrays.asList(&quot;test&quot;,&quot;test1&quot;,&quot;test2&quot;)));        
				setCode5(&quot;detail&quot;,rdCodeList, field, target);
				break;
			default:
				setCode5(&quot;detail&quot;,codeList, field, target);
				break;
		}
	}
}&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;위 코드처럼 각 Field를 가져와서 switch 문의 조건에 해당하는 코드를 변환하는 로직인데&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;문제 발생 지점에서 codeService를 통해 코드 리스트를 조회하는 부분이 매 컬럼마다 실행되어&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;의미 없는 DB 조회가 중복되고 있었고 때문에 속도가 떨어졌던 것이었음.&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;rdCodeList라는 리스트에 아무 데이터가 없을 때만 조회를 하면 딱 한 번만 데이터를 조회할 수 있다고 판단하여&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;pre id=&quot;code_1710382941938&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//변경한 코드
Field[] fields = target.getClass().getDeclaredFields();
for (Field field : fields
) {
	field.setAccessible(true);  //접근 권한 변경
	if(field.get(target) != null){
		switch (field.getName()) {
			case &quot;aCde&quot;:
				setCode1(&quot;detail&quot;,ftrcList,field,target);
				break;
			case &quot;bCde&quot;:
				setCode2(&quot;detail&quot;,hjdList,field,target);
				break;
			case &quot;cCde&quot;:
				setCode3(&quot;detail&quot;,bjdList,field,target);
				break;
			case &quot;dCde&quot;:
				setCode4(&quot;detail&quot;,mngrList,field,target);
				break;
			case &quot;eCde&quot;:
			case &quot;fCde&quot;:
			case &quot;gCde&quot;: 
			case &quot;hCde&quot;:
			case &quot;iCde&quot;: 
				if(rdCodeList.size() &amp;lt; 1){
					//한번만 조회하도록 설정
					rdCodeList = codeService.getOtherCodeListToExcel(new ArrayList&amp;lt;&amp;gt;(Arrays.asList(&quot;test1&quot;,&quot;test2&quot;,&quot;test3&quot;)));
				}     
				setCode5(&quot;detail&quot;,rdCodeList, field, target);
				break;
			default:
				setCode5(&quot;detail&quot;,codeList, field, target);
				break;
		}
	}
}&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;/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;10초 넘게 걸리던 시간이 2~3초로 확! 줄었음. &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;  &lt;b&gt;느낀 점&lt;br /&gt;&lt;/b&gt;&lt;/blockquote&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;하지만 리펙토링을 진행하고 개발한 소스의 어떤 부분이 문제였는지 알아가면서&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;또한 리펙토링의 소중함과 DB조회는 최소한으로 할 수 있도록 개발해야 한다는 것을 한번 더 상기시킬 수 있었음.&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;</description>
      <category>개발자 모드/오류처리</category>
      <category>문제해결</category>
      <category>속도기능개선</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/48</guid>
      <comments>https://precious-value.tistory.com/48#entry48comment</comments>
      <pubDate>Thu, 14 Mar 2024 11:37:48 +0900</pubDate>
    </item>
    <item>
      <title>[Python] ChatGPT를 사용한 파이썬 스크립트 작성</title>
      <link>https://precious-value.tistory.com/47</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt; 글을 쓰게 된 계기&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신규 프로젝트 진행 중 VO를 만드는데 필드를 하나하나 선언하는 게 너무 비효율적이라 생각되어서&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;ChatGPT를 사용해 파이썬 스크립트를 작성하여 반복 업무를 줄이고자 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;1. 환경 세팅&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;그리고 필자는 vsCode를 사용하였음.&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.google.com/search?q=vscode+%ED%8C%8C%EC%9D%B4%EC%8D%AC+%EC%84%A4%EC%B9%98&amp;amp;oq=&amp;amp;gs_lcrp=EgZjaHJvbWUqCQgBECMYJxjqAjIJCAAQIxgnGOoCMgkIARAjGCcY6gIyCQgCECMYJxjqAjIJCAMQIxgnGOoCMgkIBBAjGCcY6gIyCQgFECMYJxjqAjIJCAYQIxgnGOoCMgkIBxAjGCcY6gLSAQkxMTAxajBqMTWoAgiwAgE&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8&quot;&gt;https://www.google.com/search?q=vscode+%ED%8C%8C%EC%9D%B4%EC%8D%AC+%EC%84%A4%EC%B9%98&amp;amp;oq=&amp;amp;gs_lcrp=EgZjaHJvbWUqCQgBECMYJxjqAjIJCAAQIxgnGOoCMgkIARAjGCcY6gIyCQgCECMYJxjqAjIJCAMQIxgnGOoCMgkIBBAjGCcY6gIyCQgFECMYJxjqAjIJCAYQIxgnGOoCMgkIBxAjGCcY6gLSAQkxMTAxajBqMTWoAgiwAgE&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1709194466086&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;  vscode 파이썬 설치: Google 검색&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.google.com&quot; data-og-source-url=&quot;https://www.google.com/search?q=vscode+%ED%8C%8C%EC%9D%B4%EC%8D%AC+%EC%84%A4%EC%B9%98&amp;amp;oq=&amp;amp;gs_lcrp=EgZjaHJvbWUqCQgBECMYJxjqAjIJCAAQIxgnGOoCMgkIARAjGCcY6gIyCQgCECMYJxjqAjIJCAMQIxgnGOoCMgkIBBAjGCcY6gIyCQgFECMYJxjqAjIJCAYQIxgnGOoCMgkIBxAjGCcY6gLSAQkxMTAxajBqMTWoAgiwAgE&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8&quot; data-og-url=&quot;https://www.google.com/knowledgegraphshares?gs_lcrp=EgZjaHJvbWUqCQgBECMYJxjqAjIJCAAQIxgnGOoCMgkIARAjGCcY6gIyCQgCECMYJxjqAjIJCAMQIxgnGOoCMgkIBBAjGCcY6gIyCQgFECMYJxjqAjIJCAYQIxgnGOoCMgkIBxAjGCcY6gLSAQkxMTAxajBqMTWoAgiwAgE&amp;amp;ie=UTF-8&amp;amp;oq=&amp;amp;q=vscode+%ED%8C%8C%EC%9D%B4%EC%8D%AC+%EC%84%A4%EC%B9%98&amp;amp;sourceid=chrome&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/brwBSn/hyVqvw9AX5/2AsnBCMslC5ckSkt0QL0Uk/img.png?width=250&amp;amp;height=250&amp;amp;face=0_0_250_250,https://scrap.kakaocdn.net/dn/cNykrE/hyVueN2ZRS/bm3t9djK1PGWyKm6nnVBp0/img.png?width=250&amp;amp;height=250&amp;amp;face=0_0_250_250&quot;&gt;&lt;a href=&quot;https://www.google.com/search?q=vscode+%ED%8C%8C%EC%9D%B4%EC%8D%AC+%EC%84%A4%EC%B9%98&amp;amp;oq=&amp;amp;gs_lcrp=EgZjaHJvbWUqCQgBECMYJxjqAjIJCAAQIxgnGOoCMgkIARAjGCcY6gIyCQgCECMYJxjqAjIJCAMQIxgnGOoCMgkIBBAjGCcY6gIyCQgFECMYJxjqAjIJCAYQIxgnGOoCMgkIBxAjGCcY6gLSAQkxMTAxajBqMTWoAgiwAgE&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.google.com/search?q=vscode+%ED%8C%8C%EC%9D%B4%EC%8D%AC+%EC%84%A4%EC%B9%98&amp;amp;oq=&amp;amp;gs_lcrp=EgZjaHJvbWUqCQgBECMYJxjqAjIJCAAQIxgnGOoCMgkIARAjGCcY6gIyCQgCECMYJxjqAjIJCAMQIxgnGOoCMgkIBBAjGCcY6gIyCQgFECMYJxjqAjIJCAYQIxgnGOoCMgkIBxAjGCcY6gLSAQkxMTAxajBqMTWoAgiwAgE&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/brwBSn/hyVqvw9AX5/2AsnBCMslC5ckSkt0QL0Uk/img.png?width=250&amp;amp;height=250&amp;amp;face=0_0_250_250,https://scrap.kakaocdn.net/dn/cNykrE/hyVueN2ZRS/bm3t9djK1PGWyKm6nnVBp0/img.png?width=250&amp;amp;height=250&amp;amp;face=0_0_250_250');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;  vscode 파이썬 설치: Google 검색&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포스팅 보고 파이썬 설치 및 환경변수 설정, vsCode에서 확장까지 진행해야 함.&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;그리고 psycopg2 라이브러리를 설치해야 함&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;설치 명령어 : pip install psycopg2&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;설치되었는지 확인 명령어 : pip show psycopg2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;2. 메인 함수 코드 설명&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문법이 딱히 어렵지는 않음. ChatGPT를 통해 기본 스크립트문 작성함.&lt;/p&gt;
&lt;pre id=&quot;code_1709196506017&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def main():
    # 데이터베이스 연결
    conn = psycopg2.connect(
        dbname='test',
        user='user',
        password='1234',
        host='192.168.10.xx',
        port='5432'
    )
    
    # 커서 생성
    cursor = conn.cursor()
    
    #테이블 명
    table_name = 'test_table';

    
    #컬럼명, 컬럼 타입, 컬럼 코멘트 조회 쿼리
    cursor.execute(f&quot;&quot;&quot;SELECT 
    a.attname AS column_name,
    format_type(a.atttypid, a.atttypmod) AS data_type,
    d.description AS column_comment
FROM 
    pg_catalog.pg_class AS c
JOIN 
    pg_catalog.pg_attribute AS a ON c.oid = a.attrelid
LEFT JOIN 
    pg_catalog.pg_description AS d ON (c.oid = d.objoid AND a.attnum = d.objsubid)
WHERE 
    c.relname = '{table_name}'
    AND a.attnum &amp;gt; 0
ORDER BY 
    a.attnum;&quot;&quot;&quot;)
    columns = cursor.fetchall()

    print(&quot;columns :::&quot;,columns)
        
    # 자바 클래스 생성
    java_code = generate_java_class(table_name, columns)
        
    # 생성된 자바 클래스 파일 저장
    with open(f&quot;{table_name.upper()}.java&quot;, 'w', encoding=&quot;utf-8&quot;) as file:
        file.write(java_code)
    
    # 커넥션 및 커서 닫기
    cursor.close()
    conn.close()&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;메인 함수로 db 접속 연결 설정 및 쿼리문으로 필요한 정보를 조회함.&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;
&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;3. 함수 설명&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709196752882&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def generate_java_class(table_name, columns):
    # 클래스명 생성

    print(&quot;table_name :::&quot;,table_name)
    class_name = table_name.capitalize()
    
    # 필드 생성
    fields = []
    for column in columns:
        field_name = column[0]
        field_type = column[1]
        field_comment = column[2]        
                
        fields.append(f'    @Comment(value=&quot;{append_comment_field(field_comment)}&quot;)\n')
        fields.append(f&quot;    private {convert_to_java_type(field_type)} {to_camel_case(field_name)};\n&quot;)
    
    # 클래스 생성    
    java_code = f'import lombok.Getter;\nimport org.hibernate.annotations.Comment;\n\n\n@Getter\n'
    java_code += f&quot;&quot;&quot;public class {class_name.upper()} {{       
    // 필드
    \n{''.join(fields)}
    }}
    &quot;&quot;&quot;
    return java_code&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;/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_1709196769066&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#필드 타입을 java 타입으로 변경하는 함수
def convert_to_java_type(postgres_type):
    #현재 String 타입으로만 변경
    if 'character varying' in postgres_type:
        return 'String'
    elif postgres_type == 'integer':
        return 'Integer'
    elif postgres_type == 'timestamp':
        return 'String'
    elif postgres_type == 'double precision':
        return 'String'
    elif postgres_type == 'numeric':
        return 'String'
    # 추가적인 데이터 타입에 대한 매핑을 여기에 추가할 수 있습니다.
    else:
        return 'Object'  # 기본값으로 Object를 반환합니다.&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;PostgreSQL 타입을 java 타입에 맞게 변환하는 함수임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709196778345&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#필드명 카멜케이스로 변경하는 함수
def to_camel_case(column_name):    
    parts = column_name.split('_')
    camel_case_name = parts[0] + ''.join(part.capitalize() for part in parts[1:])
    return camel_case_name&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709196788278&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#코멘트가 없으면 빈 문자열 출력
def append_comment_field(field_comment):
    if field_comment is None:
        return &quot;&quot;
    else:
        return field_comment&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;/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;
&lt;p data-ke-size=&quot;size16&quot;&gt; 소스 코드 참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/dedel009/convertScripts&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/dedel009/convertScripts&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1709196812272&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - dedel009/convertScripts&quot; data-og-description=&quot;Contribute to dedel009/convertScripts development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/dedel009/convertScripts&quot; data-og-url=&quot;https://github.com/dedel009/convertScripts&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b4cKzs/hyVqneOouq/3WqxE99aOIvJ7NLTAKz1bK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/dedel009/convertScripts&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/dedel009/convertScripts&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b4cKzs/hyVqneOouq/3WqxE99aOIvJ7NLTAKz1bK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - dedel009/convertScripts&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to dedel009/convertScripts development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 모드/응용</category>
      <category>Python</category>
      <category>script</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/47</guid>
      <comments>https://precious-value.tistory.com/47#entry47comment</comments>
      <pubDate>Thu, 29 Feb 2024 17:59:33 +0900</pubDate>
    </item>
    <item>
      <title>[CORS] Axios 응답 객체에 Content-Disposition 누락 이슈 해결</title>
      <link>https://precious-value.tistory.com/46</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt; 글을 쓰게 된 계기&lt;/blockquote&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;- Spring Boot&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- TypeScript&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Mybatis&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;엑셀 기능 개발 중 Axios 응답 객체에서 Content-Disposition을 찾을 수 없는 문제가 발생함.&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;pre id=&quot;code_1708676872404&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//파일명 인코딩
String encodedFilename = URLEncoder.encode(tblName+&quot;목록&quot;,&quot;UTF-8&quot;);	
//헤더에 파일명 세팅
response.setHeader(&quot;content-disposition&quot;, &quot;attachment; filename=\&quot;&quot; + encodedFilename + &quot;.xlsx\&quot;&quot;);
//콘텐츠 타입 설정
response.setContentType(&quot;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet&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;뷰단 react에서 찍어봐도 undefinded만 뜸. 당황 &amp;zwj;♂️&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;span style=&quot;color: #000000;&quot;&gt;CORS 문제&lt;/span&gt;&lt;/b&gt;라는 것을 알게 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;b&gt; 해결방법&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;갓글에 검색해보니 @CrossOrigin어노테이션을 통해 exposedHeaders 값으로 Content-Disposition 추가해서&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_1708677255632&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping(&quot;/**&quot;)
                .allowedOriginPatterns(&quot;*&quot;)            
                .allowedMethods(&quot;*&quot;)
                .allowedHeaders(&quot;*&quot;)
                .exposedHeaders(&quot;Content-Disposition&quot;)	//추가할 구문
                .allowCredentials(true)
                .maxAge(3600);
    }
}&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;와 같이 addCorsMappings라는 메서드로 CORS 구성 설정을 하였고, allowedHeaders(&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;.exposedHeaders(&quot;Content-Disposition&quot;) 를 추가하면 response headers 객체에 content-disposition이 추가된 것을 확인할 수 있을 것임!!! &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;blockquote data-ke-style=&quot;style3&quot;&gt;- registry : CORS 구성을 적용할 URL 패턴을 설정하기 위한 CorsRegistry 객체&lt;br /&gt;- addMapping() : CORS 규칙을 적용할 url 패턴을 지정&lt;br /&gt;- allowedOrigins() : 허용된 출처(도메인)을 설정&lt;br /&gt;- allowedMethods() : 허용된 HTTP 메서드를 설정&lt;br /&gt;- allowedHeaders() : 허용된 HTTP 헤더를 설정&lt;br /&gt;- allowCredentials() : 자격증명을 사용할지 여부 설정&lt;br /&gt;- maxAge() : 사전 요청 결과를 캐시할 시간을 설정&lt;br /&gt;- '*' 는 따로 설정하지 않고 전부 허용하겠다는 것&lt;/blockquote&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; 참조 사이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://soobakba.tistory.com/30&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://soobakba.tistory.com/30&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1708677035090&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;axios로 파일 다운로드 및 Content-Disposition 정보 사용하기&quot; data-og-description=&quot;파일 다운로드 기능을 구현하면서 약간의 삽질을 하면서 애를 먹었는데 덕분에 새로운 사실들을 알게 되었다. 서버에서 ByteArray 값을 내려주는 경우 파일로 만들어 내려받기 서버에서 response head&quot; data-og-host=&quot;soobakba.tistory.com&quot; data-og-source-url=&quot;https://soobakba.tistory.com/30&quot; data-og-url=&quot;https://soobakba.tistory.com/30&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/btLnxm/hyVmSFZHdb/3JUaTnLk0QCfvP3KRTjp31/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/trzLq/hyVmUjwPHK/L3ynq5s4UrSBnbgv34Zj10/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://soobakba.tistory.com/30&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://soobakba.tistory.com/30&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/btLnxm/hyVmSFZHdb/3JUaTnLk0QCfvP3KRTjp31/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/trzLq/hyVmUjwPHK/L3ynq5s4UrSBnbgv34Zj10/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;axios로 파일 다운로드 및 Content-Disposition 정보 사용하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;파일 다운로드 기능을 구현하면서 약간의 삽질을 하면서 애를 먹었는데 덕분에 새로운 사실들을 알게 되었다. 서버에서 ByteArray 값을 내려주는 경우 파일로 만들어 내려받기 서버에서 response head&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;soobakba.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 모드/오류처리</category>
      <category>axios</category>
      <category>Content-Disposition 누락</category>
      <category>Cors</category>
      <category>SpringBoot</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/46</guid>
      <comments>https://precious-value.tistory.com/46#entry46comment</comments>
      <pubDate>Fri, 23 Feb 2024 17:47:06 +0900</pubDate>
    </item>
    <item>
      <title>[Mybatis] Pageable로 페이지 처리하기</title>
      <link>https://precious-value.tistory.com/45</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt; 글을 쓰게 된 계기&lt;/b&gt;&lt;/blockquote&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;Mybatis&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;JPA&lt;/b&gt;로는 &lt;b&gt;Pageable&lt;/b&gt;을 사용해 페이징 처리를 해보았지만, &lt;b&gt;Mybatis&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;Page&lt;/b&gt; 타입에 &lt;b&gt;Mybatis&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;/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;참고로 view 단 페이징은 이번 포스팅에서는 제외하고 back 단 구현만 포스팅함.&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;틀린 점 있다면 dm 말고 댓글로 말씀 부탁드림. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;챕터 1. pom.xml에 의존성 추가&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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: #333333; text-align: left;&quot;&gt;Spring Data에서 제공하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Pageable&lt;/b&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;필자는 Maven으로 라이브러리를 관리하고 있기에 pom.xml에 의존성을 추가함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1703655409758&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.springframework.data&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;spring-data-commons&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;&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;nbsp; 필자처럼 spring boot 프로젝트를 생성할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1703655516357&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-starter-data-jpa&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;&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;spring boot starter data jpa가 추가되어 있다면 굳이 추가하지 않아도 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt; 이유 : Spring Boot에서는 spring-boot-starter-data-jpa를 추가하면 spring-data-jpa 라이브러리와 관련된 의존성들이 자&lt;br /&gt;&lt;br /&gt;동으로 추가됩니다.&amp;nbsp;spring-boot-starter-data-jpa는 Spring Data JPA 및 Hibernate와 같은 관련 기술들을 사용하기 위한 스&lt;br /&gt;&lt;br /&gt;타터 패키지로, 필요한 의존성들을 자동으로 설정해 줍니다.&lt;/blockquote&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;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;(혹~시 필자처럼 궁금하신 분들을 위해서 찾아봄.)&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 style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;그리고 application.yml 에 mybatis 설정 중 type-aliases-package를 여러 개 설정하고 싶다면&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1703657131497&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#mybatis설정
mybatis:
  mapper-locations: classpath:mapper/**/*.xml   #mybatis 매퍼 파일 위치 설정
  type-aliases-package: egovframework.uis.employee, egovframework.common.util #return 타입 패키지 지정
  configuration:
    map-underscore-to-camel-case: true  #카멜 케이스로 변환&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;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;챕터 2. RequestList.java 파일 추가(데이터 조회, 페이징 관련 파라미터를 담을 클래스)&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;또한 변수 or 메소드 명칭도 달라질 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1703656007643&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package test.common.util;

import lombok.Builder;
import lombok.Data;
import org.springframework.data.domain.Pageable;

@Builder
@Data
public class RequestList&amp;lt;T&amp;gt; {

    private T data; //요청 파라미터
    private Pageable pageable;  //페이지 설정 관련
}&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;필자는 test.common.util 위치에 &lt;b&gt;RequestList &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;/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;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-bgNkRlaixC7lEMjU&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;챕터 3. 서비스 로직 구현&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dto에는 목록 조회 시 where 절에 들어갈 파라미터들을 담고(추후 mybatis xml의 parameterType에 들어감),&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;resultType은 Test라는 Domain으로 세팅함.&lt;/p&gt;
&lt;pre id=&quot;code_1703656297734&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController
@RequestMapping(&quot;/testUrl&quot;)
@RequiredArgsConstructor
public class TestController {//컨트롤러

    private final TestService service;	//서비스 의존성 주입

    @PostMapping
    public ResponseEntity&amp;lt;?&amp;gt; resultList(@RequestBody Dto dto, @PageableDefault(size = 5) Pageable pageable){
        return ResponseEntity.ok(service.testList(dto, pageable));
    }
}&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;span style=&quot;color: #333333;&quot;&gt;view 단이 React로 개발 중이라 REST API 구조이기 때문에 위와 같이 컨트롤러 설정을 함.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1703656437201&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service
public interface TestService {	//서비스

    Page&amp;lt;Test&amp;gt; testList(Dto dto, Pageable pageable);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1703656581404&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service
@RequiredArgsConstructor
public class TestServiceImpl implements TestService{	//서비스를 구현한 구현체

    private final TestMapper mapper;

    @Override
    public Page&amp;lt;Test&amp;gt; testList(Dto dto, Pageable pageable) {

        RequestList&amp;lt;?&amp;gt; requestList = RequestList.builder()	//RequestList 생성
                .data(dto)
                .pageable(pageable)
                .build();

        List&amp;lt;Test&amp;gt; content = mapper.testList(requestList);	//데이터 조회
        int total = mapper.listCnt(dto);	//총 레코드 수 조회

        return new PageImpl&amp;lt;&amp;gt;(content, pageable, total);	//결과를 Page로 변환 후 반환
    }
}&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;testList에는 '&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: left;&quot;&gt;RequestList.builder()&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;'를 사용하여 'RequestList' 객체를 생성하고,&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;data에는 dto 객체를, pageable에는 Spring Data JPA의 페이징 정보를 설정함.&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;그리고 RequestList&amp;lt;?&amp;gt;에서 와일드카드('?')를 사용해서 어떤 타입의 data도 받을 수 있도록 설정함.&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;PageImpl 클래스를 사용하여 content, pageable, total 정보를 이용, 최종적으로 Page 객체를 생성하고 반환함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1703657977080&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Mapper
@Repository
public interface TestMapper {	//mapper 설정

    List&amp;lt;Test&amp;gt; TestList(RequestList&amp;lt;?&amp;gt; requestList);

    int listCnt(Dto dto);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1703656994961&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper   PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot; &quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;
&amp;lt;mapper namespace=&quot;test.mapper.TestMapper&quot;&amp;gt;

	&amp;lt;!--테스트 목록 데이터--&amp;gt;
	&amp;lt;select id=&quot;TestList&quot; parameterType=&quot;RequestList&quot; resultType=&quot;Test&quot;&amp;gt;
		SELECT  id, title, content, writer
	    FROM TEST
		&amp;lt;where&amp;gt;
			&amp;lt;if test=&quot;data.title != null and data.title !='' &quot;&amp;gt;
				AND title LIKE '%'||#{data.title}||'%'
			&amp;lt;/if&amp;gt;
			&amp;lt;if test=&quot;data.writer != null and data.writer !='' &quot;&amp;gt;
				AND writer = #{data.writer}
			&amp;lt;/if&amp;gt;
		&amp;lt;/where&amp;gt;
        &amp;lt;!--ORDER BY 절 추가--&amp;gt;
		&amp;lt;if test=&quot;pageable.sort != null and !pageable.sort.isEmpty()&quot;&amp;gt;
			ORDER BY
			&amp;lt;foreach collection=&quot;pageable.sort&quot; item=&quot;order&quot; separator=&quot;,&quot;&amp;gt;
				${order.property} ${order.direction}
			&amp;lt;/foreach&amp;gt;
		&amp;lt;/if&amp;gt;
        &amp;lt;!--페이징 처리--&amp;gt;
		OFFSET #{pageable.offset} ROWS FETCH NEXT #{pageable.pageSize} ROWS ONLY
	&amp;lt;/select&amp;gt;
    
    &amp;lt;!--테스트 목록 카운트 --&amp;gt;
    &amp;lt;select id=&quot;listCnt&quot; parameterType=&quot;Dto&quot; resultType=&quot;int&quot;&amp;gt;
		SELECT COUNT(*) totcnt
		FROM TEST
		&amp;lt;where&amp;gt;
			&amp;lt;if test=&quot;title != null and title !='' &quot;&amp;gt;
				AND title LIKE '%'||#{title}||'%'
			&amp;lt;/if&amp;gt;
			&amp;lt;if test=&quot;writer != null and writer !='' &quot;&amp;gt;
				AND writer = #{writer}
			&amp;lt;/if&amp;gt;
		&amp;lt;/where&amp;gt;
    &amp;lt;/select&amp;gt;    
&amp;lt;/mapper&amp;gt;&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;테스트 목록 데이터에서는 RequestList에서 파라미터를 가져오기 때문에 data. 형식으로 가져옴.&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;하지만 테스트 목록 카운트는 Dto에서 바로 가져오기 때문에 바로 필드명을 기재함.&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;그리고 pageable 객체 안의 데이터(sort, page 정보 등)를 이용하여 order by 절을 동적으로 구현함.&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;foreach태그를 쓴 이유는 order by 절이 다수일 수도 있어서 위와 같이 설정함.&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;페이징 처리 또한 pageable 객체를 사용해 동적으로 페이징 처리를 하였음. 끝. &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;
&lt;p data-ke-size=&quot;size16&quot;&gt; 참조 사이트&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devpad.tistory.com/110&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://devpad.tistory.com/110&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1703654301533&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;스프링부트 개발환경 구성하기 (7) 페이징 (Mybatis에서 Pageable)&quot; data-og-description=&quot;포스팅 순서는 아래와 같다. OpenJDK 17 설치 STS 4 설치 스프링부트 프로젝트 생성 메이븐 Local Repository 설정 DB 설계와 REST API 설계 mybatis 연동과 게시판 목록 조회 페이징 (Mybatis에서 Pageable) (현재 포&quot; data-og-host=&quot;devpad.tistory.com&quot; data-og-source-url=&quot;https://devpad.tistory.com/110&quot; data-og-url=&quot;https://devpad.tistory.com/110&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cePyzH/hyUTxnTTwd/iwzbofrrue2BzJMuMLKTM0/img.png?width=705&amp;amp;height=797&amp;amp;face=0_0_705_797,https://scrap.kakaocdn.net/dn/bi1bjs/hyUTBqj87W/ghh4FtQGz27xYr9dEZO1f1/img.png?width=705&amp;amp;height=797&amp;amp;face=0_0_705_797,https://scrap.kakaocdn.net/dn/bNxpZD/hyUTC3OA1V/3aLQmzFKKnyTHhuKXM1K2K/img.png?width=729&amp;amp;height=871&amp;amp;face=0_0_729_871&quot;&gt;&lt;a href=&quot;https://devpad.tistory.com/110&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devpad.tistory.com/110&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cePyzH/hyUTxnTTwd/iwzbofrrue2BzJMuMLKTM0/img.png?width=705&amp;amp;height=797&amp;amp;face=0_0_705_797,https://scrap.kakaocdn.net/dn/bi1bjs/hyUTBqj87W/ghh4FtQGz27xYr9dEZO1f1/img.png?width=705&amp;amp;height=797&amp;amp;face=0_0_705_797,https://scrap.kakaocdn.net/dn/bNxpZD/hyUTC3OA1V/3aLQmzFKKnyTHhuKXM1K2K/img.png?width=729&amp;amp;height=871&amp;amp;face=0_0_729_871');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;스프링부트 개발환경 구성하기 (7) 페이징 (Mybatis에서 Pageable)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;포스팅 순서는 아래와 같다. OpenJDK 17 설치 STS 4 설치 스프링부트 프로젝트 생성 메이븐 Local Repository 설정 DB 설계와 REST API 설계 mybatis 연동과 게시판 목록 조회 페이징 (Mybatis에서 Pageable) (현재 포&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devpad.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 모드/응용</category>
      <category>myBatis</category>
      <category>pageable</category>
      <category>SpringBoot</category>
      <category>페이징처리</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/45</guid>
      <comments>https://precious-value.tistory.com/45#entry45comment</comments>
      <pubDate>Wed, 27 Dec 2023 15:31:19 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Data JPA]복합키 설정(PK가 2개 이상일 때)</title>
      <link>https://precious-value.tistory.com/44</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;1. TMI(글 작성 계기)&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;유저 테이블과 관련된 유저 권한 테이블에서 PK가 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;JPA를 사용하고 있었지만 PK가 두 개인 건 설정해 본 적이 없는 필자는&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;그냥 냅다 @id를 각 컬럼에 붙였음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignLeft&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;016&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/016.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/016.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역시 에러가 뜸... 찾아보니 ID 값이 두 개라서 매핑 오류가 떴다는 것(당연하지만)&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가지!!!&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;color: #8a3db6;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: left;&quot; data-darkreader-inline-color=&quot;&quot;&gt;1. @Embeddable 및 @EmbeddedId 설정(객체지향에 더 가까운 방법)&lt;/span&gt;&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 style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: left;&quot; data-darkreader-inline-color=&quot;&quot;&gt;2. @IdClass 설정(RDB에 가까운 방법)&lt;/span&gt;&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;인데 결국 PK 클래스를 만들어서 Serializable 을 implements 하고 각각 설정을 해주는 방식임.&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번 방법을 사용하여 복합키를 설정하였음.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;1. @Embeddable 및 @EmbeddedId 설정(객체지향에 더 가까운 방법)&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699249619161&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Data
@Entity
@AllArgsConstructor	//전체 생성자
@NoArgsConstructor	//기본 생성자
@Table(schema = &quot;com&quot;,name = &quot;cmt_user_right&quot;)
public class UserRight{	//유저 권한 테이블

    @EmbeddedId		//1번
    private UserId id;
    
//    @Column(name = &quot;user_id&quot;)         
//    private String userId;       PK
    
//    @Column(name = &quot;user_right&quot;)
//    private String userRight;     PK    

    @Column(name = &quot;sys_type&quot;)
    private String sysType;

    @Column(name = &quot;sys_date&quot;)
    private LocalDateTime sysDate;

    @Column(name = &quot;user_desc&quot;)
    private String userDesc;
}&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;/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 툴로 확인했을 때 유저 권한 테이블은 userId, userRight 이 두 컬럼이 pk로 설정되어 있었음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699249933557&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import javax.persistence.Column;
import javax.persistence.Embeddable;
import java.io.Serializable;

@Embeddable				//2번
@AllArgsConstructor		//전체생성자
@NoArgsConstructor		//기본 생성자
@EqualsAndHashCode		//equals, hashCode
@Data
public class UserId implements Serializable {	
    @Column(name = &quot;user_id&quot;)		//3번
    private String userId;
    @Column(name = &quot;user_right&quot;)
    private String userRight;

}&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;먼저 두 키를 포함한 식별자 클래스(UserId)를 생성 후 Serializable 인터페이스를 구현함.&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번처럼 @EmbeddedId 어노테이션을 붙여준 뒤 식별자 클래스 타입으로 변경해 줌.&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번처럼 @Embeedable 어노테이션 선언하고, 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;그리고 equals, hashCode를 구현해야 하며 기본 생성자가 있어야 함.&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;또 식별자 클래스(UserId)는 public이어야 한다는 점.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699251300430&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Repository
public interface UserRightRepository extends JpaRepository&amp;lt;UserRight, UserId&amp;gt; {
    List&amp;lt;UserRight&amp;gt; findByIdUserId(String userId);	//아이디 별 유저 권한 불러오기
}&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;위와 같이 설정했다면 이제 repository 설정을 위처럼 하면 되는데...(필자는 Spring Data JPA 사용 중.. )&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;유저 아이디별 권한 목록을 불러오며, UserRight 엔티티의 Id - UserId(식별자 클래스)의 userId&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;해서 findBy/Id/UserId 이런 식으로 명명규칙을 지켜주면서 선언하였음.&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;그리고 JpaRepository의 제너릭 타입에&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;Entity Class와 Entity Class의 Key 값(UserId, 식별자클래스)을 위와 같이 넣어주면 됨!!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;2. @IdClass 설정(RDB에 가까운 방법)&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699251933063&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Data
@Entity
@AllArgsConstructor	//전체 생성자
@NoArgsConstructor	//기본 생성자
@IdClass(UserId.class)	//1번
@Table(schema = &quot;com&quot;,name = &quot;cmt_user_right&quot;)
public class UserRight{	//유저 권한 테이블

    @Id	//2번
    @Column(name = &quot;user_id&quot;)         
    private String id;      //UserId.id와 매칭
    
    @Id	//2번
    @Column(name = &quot;user_right&quot;)
    private String right;     //UserId.right와 매칭

    @Column(name = &quot;sys_type&quot;)
    private String sysType;

    @Column(name = &quot;sys_date&quot;)
    private LocalDateTime sysDate;

    @Column(name = &quot;user_desc&quot;)
    private String userDesc;
}&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;@IdClass 설정은&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;마찬가지로 Serializable 인터페이스를 구현해야하고 equal, hashCode를 구현해야 함.&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;또한 기본 생성자가 있어야하고 식별자 클래스는 public이어야 함.&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;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-bgNkRlaixC7lEMjU&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&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_1699252078769&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@AllArgsConstructor		//전체생성자
@NoArgsConstructor		//기본 생성자
@EqualsAndHashCode		//equals, hashCode
@Data
public class UserId implements Serializable {	
    private String id;
    private String right;

}&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@IdClass or @EmbeddedId&amp;nbsp; 어떤 어노테이션을 사용하여 구성할지는 각자 장단점이 있기 때문에&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;&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;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://brightstarit.tistory.com/53&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://brightstarit.tistory.com/53&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1699252500754&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[JPA] 복합 키와 식별 관계 매핑&quot; data-og-description=&quot;식별관계와 비식별 관계 데이터베이스 테이블 사이에 관계는 외래 키가 기본 키에 포함되는지 여부에 따라 식별 관계와 비식별 관계로 구분된다. 식별 관계 식별 관계는 부모 테이블의 기본 키&quot; data-og-host=&quot;brightstarit.tistory.com&quot; data-og-source-url=&quot;https://brightstarit.tistory.com/53&quot; data-og-url=&quot;https://brightstarit.tistory.com/53&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bP4Bzv/hyUrDIHs73/tkQQkTNBzv7f9nLHkx6Q51/img.png?width=300&amp;amp;height=168&amp;amp;face=0_0_300_168,https://scrap.kakaocdn.net/dn/D9YPB/hyUruyeGLH/FGIWEsmWmHDT7sNWxRYa21/img.png?width=300&amp;amp;height=168&amp;amp;face=0_0_300_168,https://scrap.kakaocdn.net/dn/f2yp7/hyUrD20Ilf/TnZrc1XBJ0qz92Nb3Fr1L0/img.png?width=388&amp;amp;height=246&amp;amp;face=0_0_388_246&quot;&gt;&lt;a href=&quot;https://brightstarit.tistory.com/53&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://brightstarit.tistory.com/53&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bP4Bzv/hyUrDIHs73/tkQQkTNBzv7f9nLHkx6Q51/img.png?width=300&amp;amp;height=168&amp;amp;face=0_0_300_168,https://scrap.kakaocdn.net/dn/D9YPB/hyUruyeGLH/FGIWEsmWmHDT7sNWxRYa21/img.png?width=300&amp;amp;height=168&amp;amp;face=0_0_300_168,https://scrap.kakaocdn.net/dn/f2yp7/hyUrD20Ilf/TnZrc1XBJ0qz92Nb3Fr1L0/img.png?width=388&amp;amp;height=246&amp;amp;face=0_0_388_246');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[JPA] 복합 키와 식별 관계 매핑&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;식별관계와 비식별 관계 데이터베이스 테이블 사이에 관계는 외래 키가 기본 키에 포함되는지 여부에 따라 식별 관계와 비식별 관계로 구분된다. 식별 관계 식별 관계는 부모 테이블의 기본 키&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;brightstarit.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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>개발자 모드/응용</category>
      <category>@EmbeddedId</category>
      <category>@IdClass</category>
      <category>jpa</category>
      <category>복합키</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/44</guid>
      <comments>https://precious-value.tistory.com/44#entry44comment</comments>
      <pubDate>Mon, 6 Nov 2023 15:37:51 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] 디렉토리 변경 후 @Configuration 스캔 이슈</title>
      <link>https://precious-value.tistory.com/43</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot; data-darkreader-inline-color=&quot;&quot;&gt;1. 이슈 발생 상황&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;spring security를 사용하여 로그인 기능을 구현하려고 security config 클래스 파일을 생성하여&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;그런데 프로젝트 디렉토리 구조를 변경해야 할 듯하여 전체적으로 수정을 진행함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2hHL0/btszA2CtMW0/8Pnz4IuNqXuuScrZVkolsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2hHL0/btszA2CtMW0/8Pnz4IuNqXuuScrZVkolsk/img.png&quot; data-alt=&quot;기존 back단 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2hHL0/btszA2CtMW0/8Pnz4IuNqXuuScrZVkolsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2hHL0%2FbtszA2CtMW0%2F8Pnz4IuNqXuuScrZVkolsk%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;392&quot; height=&quot;316&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기존 back단 구조&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;이해를 돕기위해 이런 식으로 구조가 되어 있었다고 가정하겠음.&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;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;359&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H9b2y/btszzG07TIK/B5LYRyETZ0AkztXkKZsEH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H9b2y/btszzG07TIK/B5LYRyETZ0AkztXkKZsEH0/img.png&quot; data-alt=&quot;바뀐 back단 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H9b2y/btszzG07TIK/B5LYRyETZ0AkztXkKZsEH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH9b2y%2FbtszzG07TIK%2FB5LYRyETZ0AkztXkKZsEH0%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;423&quot; height=&quot;359&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;359&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;바뀐 back단 구조&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;이런식으로 구조를 변경했는데(실제 프로젝트는 아님)...&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;security로 만들었던 로그인 기능이 작동을 안 함(로그인이 안 되는 상황 발생)&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;갓글에 검색하기에도 어려웠음. &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;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-bgNkRlaixC7lEMjU&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;b&gt;2. 이슈가 발생한 과정 및 이유&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;돌고 돌다 @Configuration이 작동을 안 하는 듯하여 찾아보니&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;@ComponentScan을 사용하여 package 범위를 지정할 수 있다는 것을 알게 됨.&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;기존 Spring 프로젝트에서는 security.xml 파일에 scan 패키지 범위를 지정했지만...&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;Spring boot 프로젝트에서는 따로 작성한 부분을 찾을 수 없었음.&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;처음 Spring boot 프로젝트를 만들면 자동으로 설정되어있는&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;@SpringBootApplication&amp;nbsp;&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;/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;실제로 application 클래스에 &lt;b&gt;@SpringBootApplication&amp;nbsp;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1324&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crVLzi/btszAmVESSr/YfsCjluwX6iXvCaEDnIWi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crVLzi/btszAmVESSr/YfsCjluwX6iXvCaEDnIWi0/img.png&quot; data-alt=&quot;SpringBootApplication.class 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crVLzi/btszAmVESSr/YfsCjluwX6iXvCaEDnIWi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrVLzi%2FbtszAmVESSr%2FYfsCjluwX6iXvCaEDnIWi0%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;1324&quot; height=&quot;493&quot; data-origin-width=&quot;1324&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SpringBootApplication.class 화면&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;이런 식으로 설정이 되어있는 것을 볼 수 있음.&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;이중 아까 언급했던 @ComponentScan이 설정되어 있고,&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;내가 직접 ComponentScan 설정을 하지 않았다면&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;@SpringBootApplication &lt;/b&gt;어노테이션이 정의된 곳이 &lt;span style=&quot;color: #5733b1;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;b&gt;base package&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;필자는 디렉토리 구조를 변경하면서 introduce라는 패키지를 만들었고 그 과정에서&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;@SpringBootApplication&lt;span&gt;&amp;nbsp;&lt;/span&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;size16&quot;&gt;ExamAppilication 클래스 파일이 security 설정파일과 분리되어&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;@Configure 어노테이션이 작동을 안 하였던 것이었음!!!!!!!!!!!!! &amp;zwj;♂️&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #5f6d2b;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;b&gt;3. 해결방법&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;&lt;b&gt;@SpringBootApplication&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;어노테이션이 정의된 곳인 ExamAppilication 클래스 파일을&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;최상위 경로로 옮겨주면 잘 작동함.(위 사진에서는 com 경로 밑으로 옮겨주면 작동함 )&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot; data-darkreader-inline-color=&quot;&quot;&gt;마치며&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 상황뿐만 아니라 Spring boot 프로젝트는&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;그만큼 설정을 자동으로 해주는 것이기에&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;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;이렇게 다른 곳에서 이슈를 만날 수 있으니 기본기를 충실히 해야겠음. &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;</description>
      <category>개발자 모드/응용</category>
      <category>ComponentScan</category>
      <category>configuration</category>
      <category>Spring Boot</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/43</guid>
      <comments>https://precious-value.tistory.com/43#entry43comment</comments>
      <pubDate>Wed, 1 Nov 2023 15:10:03 +0900</pubDate>
    </item>
    <item>
      <title>[토스페이먼츠] 개발환경에서 가상계좌 테스트하기</title>
      <link>https://precious-value.tistory.com/42</link>
      <description>&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;a href=&quot;https://docs.tosspayments.com/common/webhook&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.tosspayments.com/common/webhook&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1694507581817&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;웹훅(Webhook) 연동하기 | 토스페이먼츠 개발자센터&quot; data-og-description=&quot;웹훅은 데이터가 변경되었을 때 상점 서버에서 실시간으로 알림을 받을 수 있는 기능입니다. 웹훅을 연동해서 결제 상태 변경, 지급대행 실행, 브랜드페이 고객 결제수단 업데이트와 같은 변경 &quot; data-og-host=&quot;docs.tosspayments.com&quot; data-og-source-url=&quot;https://docs.tosspayments.com/common/webhook&quot; data-og-url=&quot;https://docs.tosspayments.com/common/webhook&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cepylv/hyTSsorSIM/dKmT8oIWwIap8hhljs2aEK/img.png?width=780&amp;amp;height=390&amp;amp;face=0_0_780_390,https://scrap.kakaocdn.net/dn/bQVy3R/hyTSvrYret/GVAkZfpI6oQ7JZcOk0ckTk/img.png?width=3850&amp;amp;height=2346&amp;amp;face=0_0_3850_2346,https://scrap.kakaocdn.net/dn/bpsS2b/hyTSDDw5WB/3PNJ4NmFAElteC0QxapSJ0/img.png?width=3330&amp;amp;height=1552&amp;amp;face=0_0_3330_1552&quot;&gt;&lt;a href=&quot;https://docs.tosspayments.com/common/webhook&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.tosspayments.com/common/webhook&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cepylv/hyTSsorSIM/dKmT8oIWwIap8hhljs2aEK/img.png?width=780&amp;amp;height=390&amp;amp;face=0_0_780_390,https://scrap.kakaocdn.net/dn/bQVy3R/hyTSvrYret/GVAkZfpI6oQ7JZcOk0ckTk/img.png?width=3850&amp;amp;height=2346&amp;amp;face=0_0_3850_2346,https://scrap.kakaocdn.net/dn/bpsS2b/hyTSDDw5WB/3PNJ4NmFAElteC0QxapSJ0/img.png?width=3330&amp;amp;height=1552&amp;amp;face=0_0_3330_1552');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;웹훅(Webhook) 연동하기 | 토스페이먼츠 개발자센터&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;웹훅은 데이터가 변경되었을 때 상점 서버에서 실시간으로 알림을 받을 수 있는 기능입니다. 웹훅을 연동해서 결제 상태 변경, 지급대행 실행, 브랜드페이 고객 결제수단 업데이트와 같은 변경&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.tosspayments.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;gt; 테스트 결제내역에서 입금처리 or 취소 버튼 클릭했을 때&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;하지만 로컬이라도 웹훅을 받을 수 있다는 방법이 있어서 이렇게 소개해보고자 함.&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;span style=&quot;color: #f89009;&quot;&gt;시작하기 앞서, 이 글은 웹훅 연동하기 기능(가상계좌 관련)만 포스팅하는 것이므로 &lt;/span&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;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;다소 내용이 부족할 수 있음. 미리 양해바람 &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;※ 웹훅(Webhook)이란?&lt;br /&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 데이터가 변경되었을 때 상점 서버에서 실시간으로 알림을 받을 수 있는 기능으로 웹훅을 연동하여 결제 상태 변경, 지급대행 실행 등 변경 사항을 실시간으로 받을 수 있음.&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;1. 웹훅 등록 방법&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qxCTP/btstSzMkpRX/SAJigm6fQ3VeuMMfFrCzLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qxCTP/btstSzMkpRX/SAJigm6fQ3VeuMMfFrCzLk/img.png&quot; data-alt=&quot;내 개발정보 좌측 메뉴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qxCTP/btstSzMkpRX/SAJigm6fQ3VeuMMfFrCzLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqxCTP%2FbtstSzMkpRX%2FSAJigm6fQ3VeuMMfFrCzLk%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; alt=&quot;메뉴사진&quot; loading=&quot;lazy&quot; width=&quot;208&quot; height=&quot;388&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;468&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;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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;789&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcx5ws/btstRr2jAMy/B8V33oq72KMaaY4IgRApMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcx5ws/btstRr2jAMy/B8V33oq72KMaaY4IgRApMk/img.png&quot; data-alt=&quot;웹훅 등록 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcx5ws/btstRr2jAMy/B8V33oq72KMaaY4IgRApMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdcx5ws%2FbtstRr2jAMy%2FB8V33oq72KMaaY4IgRApMk%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; alt=&quot;등록화면사진&quot; loading=&quot;lazy&quot; width=&quot;488&quot; height=&quot;403&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;789&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;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;+ 웹훅 등록하기 &lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;버튼을 클릭하면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이런 화면이 뜸.&lt;/span&gt;&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;이름은 독자분들 하고 싶은 대로 설정한 뒤 URL을 입력해야 하는데&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;http://localhost:8080 이런 식으로 입력하면 당연히 등록이 되지 않음.&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;그래서 토스페이먼츠 측에서 로컬에서도 테스트할 수 있도록 ngrok라는 툴을 알려주는데...&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;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-bgNkRlaixC7lEMjU&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;1-1 ngrok 다운로드&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;a href=&quot;https://ngrok.com/download&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ngrok.com/download&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1694508925802&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Download&quot; data-og-description=&quot;$ ngrok config add-authtoken &amp;lt;token&amp;gt;&quot; data-og-host=&quot;ngrok.com&quot; data-og-source-url=&quot;https://ngrok.com/download&quot; data-og-url=&quot;https://ngrok.com/download&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://ngrok.com/download&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ngrok.com/download&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Download&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;$ ngrok config add-authtoken &amp;lt;token&amp;gt;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ngrok.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1355&quot; data-origin-height=&quot;878&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EwosH/btstC2b2BAq/dIbOaJHfdb5CXp0kbhpsBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EwosH/btstC2b2BAq/dIbOaJHfdb5CXp0kbhpsBk/img.png&quot; data-alt=&quot;ngrok 다운로드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EwosH/btstC2b2BAq/dIbOaJHfdb5CXp0kbhpsBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEwosH%2FbtstC2b2BAq%2FdIbOaJHfdb5CXp0kbhpsBk%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; alt=&quot;ngrok사진&quot; loading=&quot;lazy&quot; width=&quot;485&quot; height=&quot;314&quot; data-origin-width=&quot;1355&quot; data-origin-height=&quot;878&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ngrok 다운로드&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;위 화면이 뜨는데 각자 맞는 OS 선택 후 다운로드를 하면 됨!&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;필자는 window os라서 window 탭을 클릭 후 다운로드를 진행했음.&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;다운로드 한 zip 파일 안에 ngrok.exe라는 파일이 있을 텐데 압축 풀고 실행하면&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;cmd 창에 설명이 주루룩 뜸.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;제목 없음.png&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6MSUN/btstRJ9OlX5/zIpn9mxwlNZzvCNiT9vPsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6MSUN/btstRJ9OlX5/zIpn9mxwlNZzvCNiT9vPsk/img.png&quot; data-alt=&quot;ngrok.exe 실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6MSUN/btstRJ9OlX5/zIpn9mxwlNZzvCNiT9vPsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6MSUN%2FbtstRJ9OlX5%2FzIpn9mxwlNZzvCNiT9vPsk%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; alt=&quot;실행화면사진&quot; loading=&quot;lazy&quot; width=&quot;677&quot; height=&quot;385&quot; data-filename=&quot;제목 없음.png&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ngrok.exe 실행 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 명령창에 ngrok http 포워딩할 포트번호를 입력하면 되는데&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;필자는 8080 포트를 포워딩할 거라서 ngrok http 8080을 입력!!&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAK07E/btstRrasMvx/g02sDgM21J2XiRmh1p9HQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAK07E/btstRrasMvx/g02sDgM21J2XiRmh1p9HQ1/img.png&quot; data-alt=&quot;토스페이먼츠 웹훅 연동하기 ngrok 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAK07E/btstRrasMvx/g02sDgM21J2XiRmh1p9HQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAK07E%2FbtstRrasMvx%2Fg02sDgM21J2XiRmh1p9HQ1%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; alt=&quot;ngrok화면&quot; loading=&quot;lazy&quot; width=&quot;647&quot; height=&quot;402&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;토스페이먼츠 웹훅 연동하기 ngrok 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콘솔에 이렇게 정보가 나타나고 우리가 필요한 값은 Forwarding &amp;gt; &lt;a href=&quot;https://6ef2-211-108-54-165.jp.ngrok.io&quot;&gt;https://6ef2-211-108-54-165.jp.ngrok.io&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;이 URL을 localhost:8080에 포워딩해준다는 말임.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;1-2 마무리&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 다시 돌아와 웹훅 등록하기 화면에서 URL에 자신이 포워딩받은 URL에 추가로&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;가상계좌 정보를 받을 컨트롤러에 매핑시킬 path를 붙여 추가하면 됨.(말씀드렸듯이 back 단이 구성되어 있다는 가정임.)&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://6ef2-211-108-54-165.jp.ngrok.io&quot;&gt;https://6ef2-211-108-54-165.jp.ngrok.io&lt;/a&gt;/test/pamentInfo&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;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;DEPOSIT_CALLBACK을 체크 후 등록하기 버튼 클릭!&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: #000000; letter-spacing: 0px;&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: #000000; letter-spacing: 0px;&quot;&gt;이벤트 정보는 구독할 이벤트 버튼 옆에 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;타입별 설명보기 &amp;gt;&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;버튼을 클릭하면 알 수 있음!&lt;/span&gt;&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;171&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byt7jM/btstLOLhXAo/3MaBKwfQQrwHf61lJw6P9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byt7jM/btstLOLhXAo/3MaBKwfQQrwHf61lJw6P9k/img.png&quot; data-alt=&quot;웹훅 등록화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byt7jM/btstLOLhXAo/3MaBKwfQQrwHf61lJw6P9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbyt7jM%2FbtstLOLhXAo%2F3MaBKwfQQrwHf61lJw6P9k%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; alt=&quot;등록화면&quot; loading=&quot;lazy&quot; width=&quot;869&quot; height=&quot;171&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;171&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;보면 이런 식으로 등록이 완료된 걸 볼 수 있음!&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;그리고 입금처리 버튼을 클릭하면 웹훅을 등록했던 URL로 가상계좌 관련 정보가 넘어옴!!&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 모드/응용</category>
      <category>로컬</category>
      <category>테스트</category>
      <category>토스 로컬 가상계좌</category>
      <category>토스 로컬 테스트</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/42</guid>
      <comments>https://precious-value.tistory.com/42#entry42comment</comments>
      <pubDate>Wed, 13 Sep 2023 11:15:24 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot]JSP 수정한 코드가 바로 적용 안될 때</title>
      <link>https://precious-value.tistory.com/41</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Boot 프로젝트를 생성해 front 단을 jsp로 구성하려고 설정한 뒤&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;jsp 파일을 만들고 간단한 태그를 추가했는데&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;F5를 눌러도 변경되지 않는 것!!❓&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;보통 jsp는 서버를 끄고 재구동 시키지 않아도 바로 적용이 되었는데&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;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-bgNkRlaixC7lEMjU&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #953b34;&quot;&gt;&lt;b&gt;해결책&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이유는 잘 모르겠으나 필자가 추측하기론 spring boot는 jsp 사용을 권장하지 않아서&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;다시 돌아와 해결책은 pom.xml 에&lt;/p&gt;
&lt;pre id=&quot;code_1693472057432&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;dependency&amp;gt;
        &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;spring-boot-devtools&amp;lt;/artifactId&amp;gt;
    &amp;lt;/dependency&amp;gt;&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;/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;application.yml 파일에서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1693472081194&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring:
  devtools:
    livereload:
      enabled: true&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;/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;설정한 뒤 maven reload 후 서버 재구동하면 바로 적용이 되는 것을 볼 수 있음 &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;
&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;&lt;a href=&quot;https://sungsu9022.github.io/posts/devlog-spring-boot-tools/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://sungsu9022.github.io/posts/devlog-spring-boot-tools/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1693471861807&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Spring Boot JSP 자동 reload 되지 않는 문제 해결 방법&quot; data-og-description=&quot;Spring Boot JSP 자동 reload 되지 않는 문제 해결 방법 내용 legacy Spring Project에서 Spring boot로 전환되었을때 즉시 발견할수 있는 문제중 하나는 IDE에서 jsp파일을 수정해도 auto reload되지 않는 문제입니&quot; data-og-host=&quot;sungsu9022.github.io&quot; data-og-source-url=&quot;https://sungsu9022.github.io/posts/devlog-spring-boot-tools/&quot; data-og-url=&quot;https://sungsu9022.github.io/posts/devlog-spring-boot-tools/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ctToY8/hyTMauxbK6/DmkXKx6YN5DKAZqk63vUx0/img.jpg?width=3024&amp;amp;height=4032&amp;amp;face=0_0_3024_4032&quot;&gt;&lt;a href=&quot;https://sungsu9022.github.io/posts/devlog-spring-boot-tools/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sungsu9022.github.io/posts/devlog-spring-boot-tools/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ctToY8/hyTMauxbK6/DmkXKx6YN5DKAZqk63vUx0/img.jpg?width=3024&amp;amp;height=4032&amp;amp;face=0_0_3024_4032');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Spring Boot JSP 자동 reload 되지 않는 문제 해결 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Spring Boot JSP 자동 reload 되지 않는 문제 해결 방법 내용 legacy Spring Project에서 Spring boot로 전환되었을때 즉시 발견할수 있는 문제중 하나는 IDE에서 jsp파일을 수정해도 auto reload되지 않는 문제입니&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sungsu9022.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.devtools.livereload&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.devtools.livereload&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1693472098002&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Developing with Spring Boot&quot; data-og-description=&quot;This section goes into more detail about how you should use Spring Boot. It covers topics such as build systems, auto-configuration, and how to run your applications. We also cover some Spring Boot best practices. Although there is nothing particularly spe&quot; data-og-host=&quot;docs.spring.io&quot; data-og-source-url=&quot;https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.devtools.livereload&quot; data-og-url=&quot;https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.devtools.livereload&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.devtools.livereload&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.devtools.livereload&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Developing with Spring Boot&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This section goes into more detail about how you should use Spring Boot. It covers topics such as build systems, auto-configuration, and how to run your applications. We also cover some Spring Boot best practices. Although there is nothing particularly spe&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.spring.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 모드/응용</category>
      <category>jsp</category>
      <category>Spring Boot</category>
      <category>바로적용</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/41</guid>
      <comments>https://precious-value.tistory.com/41#entry41comment</comments>
      <pubDate>Thu, 31 Aug 2023 17:56:16 +0900</pubDate>
    </item>
    <item>
      <title>[Maven]Blocked mirror for repositories: [...]</title>
      <link>https://precious-value.tistory.com/40</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;기존 프로젝트를 git에서 clone 받아와서&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;maven으로 빌드를 진행했는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;에러 내용&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Failed to execute goal on project uis2021: Could not resolve dependencies for project com.insight.web:uis2021:war:1.0.0: Failed to collect dependencies at net.sf.ehcache:ehcache-terracotta:jar:2.1.1: Failed to read artifact descriptor for net.sf.ehcache:ehcache-terracotta:jar:2.1.1: Could not transfer artifact org.terracotta.forge:forge-parent:pom:2.0 from/to maven-default-http-blocker (http://0.0.0.0/): Blocked mirror for repositories: [egovframe2 (ht tp://maven.egovframe.kr:8080/maven/, default, releases), terracotta-repository (http://www.terracotta.org/download/reflector/releases, default, releases+snapshots)] -&amp;gt; [Help 1]&lt;/blockquote&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;/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.8.1 버전부터는 기본적으로 http에 대한 외부 접근을 막는 것으로 변경.&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;필자도 pom.xml 을 찾아보니 repository에 http:// 로 시작하는 설정이 있었음.&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;268&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biegb1/btssihOSv99/9kA0DxdN30FYrsDRE0ycdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biegb1/btssihOSv99/9kA0DxdN30FYrsDRE0ycdK/img.png&quot; data-alt=&quot;IntelliJ File 탭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biegb1/btssihOSv99/9kA0DxdN30FYrsDRE0ycdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbiegb1%2FbtssihOSv99%2F9kA0DxdN30FYrsDRE0ycdK%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;223&quot; height=&quot;487&quot; data-origin-width=&quot;268&quot; data-origin-height=&quot;585&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;IntelliJ File 탭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;settings... &amp;gt; Build, Execution, Deployment &amp;gt; Build Tools &amp;gt; Maven 탭에서&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;user settings file 경로를 확인하여 해당 경로의 settings.xml 파일을 편집.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-bgNkRlaixC7lEMjU&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;pre id=&quot;code_1693298698600&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;settings xmlns=&quot;http://maven.apache.org/SETTINGS/1.0.0&quot;
xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
xsi:schemaLocation=&quot;http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd&quot;&amp;gt;

&amp;lt;mirrors&amp;gt;
&amp;lt;mirror&amp;gt;
    &amp;lt;id&amp;gt;maven-default-http-blocker&amp;lt;/id&amp;gt;
    &amp;lt;mirrorOf&amp;gt;external:dont-match-anything-mate:*&amp;lt;/mirrorOf&amp;gt;
    &amp;lt;name&amp;gt;Pseudo repository to mirror external repositories initially using HTTP.&amp;lt;/name&amp;gt;
    &amp;lt;url&amp;gt;http://0.0.0.0/&amp;lt;/url&amp;gt;
&amp;lt;/mirror&amp;gt;
&amp;lt;/mirrors&amp;gt;


&amp;lt;/settings&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&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;해당 코드는 maven 설정 중 http로 접속을 허용하도록 변경하는 코드임.&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;But, 혹시 필자처럼 해당 경로에 settings.xml이라는 파일이 없는 분들도 있을 거임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;58&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mgejJ/btssk0TCNwX/S2T8kbKT8TKnvONTNEzKy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mgejJ/btssk0TCNwX/S2T8kbKT8TKnvONTNEzKy1/img.png&quot; data-alt=&quot;.../.m2 경로&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mgejJ/btssk0TCNwX/S2T8kbKT8TKnvONTNEzKy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmgejJ%2Fbtssk0TCNwX%2FS2T8kbKT8TKnvONTNEzKy1%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;642&quot; height=&quot;58&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;58&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;.../.m2 경로&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럴 땐 당황하지 말고 settings.xml 파일을 만들어서 위 코드만 추가해서 저장하면 됨. &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;
&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;a href=&quot;https://www.appletong.com/entry/maven-default-http-blocker-Blocked-mirror-for-repositories&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.appletong.com/entry/maven-default-http-blocker-Blocked-mirror-for-repositories&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1693298813198&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;maven-default-http-blocker (http://0.0.0.0/): Blocked mirror for repositories&quot; data-og-description=&quot;maven-default-http-blocker (http://0.0.0.0/): Blocked mirror for repositories. maven 빌드시에 위와 같은 에러가 발생을 하고 있다. maven 3.8.1 버전부터는 http 에 대한 외부 연결을 기본적으로 막는다고 한다. 에러 내&quot; data-og-host=&quot;www.appletong.com&quot; data-og-source-url=&quot;https://www.appletong.com/entry/maven-default-http-blocker-Blocked-mirror-for-repositories&quot; data-og-url=&quot;https://www.appletong.com/entry/maven-default-http-blocker-Blocked-mirror-for-repositories&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/6OoQC/hyTL2JkZe0/uJikCxOImz2oe0yKkRBhpk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/xf9Sr/hyTMgANuFv/H4zN2EVQYsgxc7cHyQ7321/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://www.appletong.com/entry/maven-default-http-blocker-Blocked-mirror-for-repositories&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.appletong.com/entry/maven-default-http-blocker-Blocked-mirror-for-repositories&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/6OoQC/hyTL2JkZe0/uJikCxOImz2oe0yKkRBhpk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/xf9Sr/hyTMgANuFv/H4zN2EVQYsgxc7cHyQ7321/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;maven-default-http-blocker (http://0.0.0.0/): Blocked mirror for repositories&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;maven-default-http-blocker (http://0.0.0.0/): Blocked mirror for repositories. maven 빌드시에 위와 같은 에러가 발생을 하고 있다. maven 3.8.1 버전부터는 http 에 대한 외부 연결을 기본적으로 막는다고 한다. 에러 내&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.appletong.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 모드/오류처리</category>
      <category>build</category>
      <category>error</category>
      <category>http</category>
      <category>maven</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/40</guid>
      <comments>https://precious-value.tistory.com/40#entry40comment</comments>
      <pubDate>Tue, 29 Aug 2023 17:49:02 +0900</pubDate>
    </item>
    <item>
      <title>[Maven]Fatal error compiling: invalid flag: --release</title>
      <link>https://precious-value.tistory.com/39</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만에 Spring Boot 프로젝트를 만드려고 spring initializr 사이트에서 3.x 대 버전의&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;Spring Boot 프로젝트를 선택하고 java 8 version으로 생성했음.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1726&quot; data-origin-height=&quot;946&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diPlqA/btssAG0n2JF/U2Lb9c6SNxiZBkjWPIr2T0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diPlqA/btssAG0n2JF/U2Lb9c6SNxiZBkjWPIr2T0/img.png&quot; data-alt=&quot;출처 :&amp;amp;amp;nbsp;https://start.spring.io/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diPlqA/btssAG0n2JF/U2Lb9c6SNxiZBkjWPIr2T0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiPlqA%2FbtssAG0n2JF%2FU2Lb9c6SNxiZBkjWPIr2T0%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; alt=&quot;spring initializr&quot; loading=&quot;lazy&quot; width=&quot;736&quot; height=&quot;403&quot; data-origin-width=&quot;1726&quot; data-origin-height=&quot;946&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;amp;nbsp;https://start.spring.io/&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;그런데 프로젝트를 intelliJ에서 import 하고 mvn package 명령어를 입력했는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef6f53;&quot; data-darkreader-inline-color=&quot;&quot;&gt;에러 내용&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.11.0:compile (default-compile) on project test: Fatal error compiling: invalid flag: --release -&amp;gt; [Help 1]&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 같은 에러가 뜨면서 빌드가 실패함. 다른 메이븐 명령어도 동일. &amp;zwj;♂️&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;갓글 曰 : 스프링 부트마다 호환되는 java 버전이 있음 &amp;gt; 3.x 버전은 최소 java17 버전 사용해야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-bgNkRlaixC7lEMjU&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&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.x 버전으로 내리고 사용하면 되겠다 싶었는데&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;어느 블로그들에서 말하기를 java8을 사용할 시 spring boot 2.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;이것도 찾아보니 공식 문서에서 2.x 버전은 java 8을 사용할 수 있다고 명시되어 있음. (참조 사이트 참고)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;즉, Spring Boot &lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot; data-darkreader-inline-color=&quot;&quot;&gt;2.x 까지는 java 8 호환 가능&lt;/span&gt;&lt;/b&gt;하며, &lt;span style=&quot;color: #5733b1;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;b&gt;3.x 버전부터는 17 버전을&lt;/b&gt;&lt;/span&gt; 사용해야 함.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 메이저 버전 X.0에서 명시한 요구사항들은 마이너 버전에서 따로 명시하지 않는다고 함. &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;필자처럼 java8 버전을 사용하고 싶다면 Spring Boot 2.x 대 버전을 사용해 프로젝트를 생성하면 되겠음. &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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://okky.kr/questions/1445843&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://okky.kr/questions/1445843&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1693288891686&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;OKKY - java8 spring boot 호환 버전 질문있습니다.&quot; data-og-description=&quot;안녕하세요구글링해서 나오는 블로그들에는java8을 사용할 시 spring boot 2.1 이하 버전만 호환 가능한걸로 나오는데공식 문서에서 찾아보니3.0에서 8 미지원은 찾았는데https://github.com/spring-projects/sp&quot; data-og-host=&quot;okky.kr&quot; data-og-source-url=&quot;https://okky.kr/questions/1445843&quot; data-og-url=&quot;https://okky.kr/questions/1445843&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://okky.kr/questions/1445843&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://okky.kr/questions/1445843&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;OKKY - java8 spring boot 호환 버전 질문있습니다.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요구글링해서 나오는 블로그들에는java8을 사용할 시 spring boot 2.1 이하 버전만 호환 가능한걸로 나오는데공식 문서에서 찾아보니3.0에서 8 미지원은 찾았는데https://github.com/spring-projects/sp&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;okky.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1693289184433&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Spring Boot 2.0 Release Notes&quot; data-og-description=&quot;Spring Boot. Contribute to spring-projects/spring-boot development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes&quot; data-og-url=&quot;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ctm88T/hyTMiegwEx/DYQ57m8FLGuPnUumLkY0lk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ctm88T/hyTMiegwEx/DYQ57m8FLGuPnUumLkY0lk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Spring Boot 2.0 Release Notes&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Spring Boot. Contribute to spring-projects/spring-boot development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-boot/docs/2.7.12/reference/html/getting-started.html#getting-started.system-requirements&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.spring.io/spring-boot/docs/2.7.12/reference/html/getting-started.html#getting-started.system-requirements&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1693289096046&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Getting Started&quot; data-og-description=&quot;If you are getting started with Spring Boot, or &amp;ldquo;Spring&amp;rdquo; in general, start by reading this section. It answers the basic &amp;ldquo;what?&amp;rdquo;, &amp;ldquo;how?&amp;rdquo; and &amp;ldquo;why?&amp;rdquo; questions. It includes an introduction to Spring Boot, along with installation instructions.&quot; data-og-host=&quot;docs.spring.io&quot; data-og-source-url=&quot;https://docs.spring.io/spring-boot/docs/2.7.12/reference/html/getting-started.html#getting-started.system-requirements&quot; data-og-url=&quot;https://docs.spring.io/spring-boot/docs/2.7.12/reference/html/getting-started.html#getting-started.system-requirements&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-boot/docs/2.7.12/reference/html/getting-started.html#getting-started.system-requirements&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.spring.io/spring-boot/docs/2.7.12/reference/html/getting-started.html#getting-started.system-requirements&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Getting Started&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;If you are getting started with Spring Boot, or &amp;ldquo;Spring&amp;rdquo; in general, start by reading this section. It answers the basic &amp;ldquo;what?&amp;rdquo;, &amp;ldquo;how?&amp;rdquo; and &amp;ldquo;why?&amp;rdquo; questions. It includes an introduction to Spring Boot, along with installation instructions.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.spring.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 모드/오류처리</category>
      <category>build</category>
      <category>error</category>
      <category>maven</category>
      <category>Spring Boot</category>
      <category>version</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/39</guid>
      <comments>https://precious-value.tistory.com/39#entry39comment</comments>
      <pubDate>Tue, 29 Aug 2023 15:11:00 +0900</pubDate>
    </item>
    <item>
      <title>[Maven]There are test failures(feat. Failed to determine a suitable driver class) 에러 해결 방법</title>
      <link>https://precious-value.tistory.com/38</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;기존 진행하는 React 프로젝트에 back단으로 Spring Boot를 추가하려고&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;a href=&quot;https://start.spring.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://start.spring.io&lt;/a&gt; 사이트에서 아래와 같은 설정으로 프로젝트를 생성함.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1702&quot; data-origin-height=&quot;951&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqM8sR/btssf1FEi1f/WXiRJTyqZ7U0wKGCIawqMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqM8sR/btssf1FEi1f/WXiRJTyqZ7U0wKGCIawqMk/img.png&quot; data-alt=&quot;출처 : https://start.spring.io&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqM8sR/btssf1FEi1f/WXiRJTyqZ7U0wKGCIawqMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqM8sR%2Fbtssf1FEi1f%2FWXiRJTyqZ7U0wKGCIawqMk%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; alt=&quot;출처사진&quot; loading=&quot;lazy&quot; width=&quot;654&quot; height=&quot;365&quot; data-origin-width=&quot;1702&quot; data-origin-height=&quot;951&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : https://start.spring.io&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;생성된 프로젝트 zip파일을 풀고 기분 좋게 intelliJ에서 import를 시킴. &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;그리고 메이븐으로 mvn install 명령어를 실행시켰는데..?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot; data-darkreader-inline-color=&quot;&quot;&gt;에러코드&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on project uis: There are test failures.&lt;br /&gt;&lt;br /&gt;Please refer to D:\dev\uis\target\surefire-reports for the individual test results. &lt;br /&gt;...&lt;/blockquote&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;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-bgNkRlaixC7lEMjU&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&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;빌드 중에 난 게 아니라 테스트 중에 에러가 났고 해결방법은 아래 사이트를 보면 아시겠지만&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;pom.xml 파일 &amp;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_1693212444414&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt;
       &amp;lt;version&amp;gt;2.22.0&amp;lt;/version&amp;gt;
    &amp;lt;configuration&amp;gt;
        &amp;lt;testFailureIgnore&amp;gt;true&amp;lt;/testFailureIgnore&amp;gt;
    &amp;lt;/configuration&amp;gt;
&amp;lt;/plugin&amp;gt;&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;/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;테스트 실패를 무시한다는 게 영 찜찜해서 다른 에러를 찾아봄.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot; data-darkreader-inline-color=&quot;&quot;&gt;에러코드&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&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;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;java.lang.IllegalStateException: Failed to load ApplicationContext Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean i nstantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested except ion is org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Failed to determine a suitable driver class Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is org.springframework.boot.autoconfigure.jdb c.DataSourceProperties$DataSourceBeanCreationException: Failed to determine a suitable driver class Caused by: org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Failed to determine a suitable driver class&lt;/blockquote&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;zwj;♂️&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;대충 보니 jpa 관련 문제인 듯하지만 일단 갓글에 에러(&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-darkreader-inline-bgcolor=&quot;&quot; data-darkreader-inline-color=&quot;&quot;&gt;ailed to determine a suitable driver class&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;이유는 프로젝트 생성 시 JPA, Mybatis Dependency를 추가했었는데 datasource를 설정해주지 않아서 에러가 난 것 &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;바로 pom.xml 파일로 가서 mybatis 및 jpa 의존성을 주석처리하고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;542&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ejNjkY/btssvv5Klkn/gSLvlusrbm1RRYMoxFSbx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ejNjkY/btssvv5Klkn/gSLvlusrbm1RRYMoxFSbx0/img.png&quot; data-alt=&quot;pom.xml 의존성 주석처리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ejNjkY/btssvv5Klkn/gSLvlusrbm1RRYMoxFSbx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FejNjkY%2Fbtssvv5Klkn%2FgSLvlusrbm1RRYMoxFSbx0%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; alt=&quot;주석처리사진&quot; loading=&quot;lazy&quot; width=&quot;583&quot; height=&quot;415&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;542&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;pom.xml 의존성 주석처리&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;mvn install 해보니 정상적으로 빌드 및 테스트가 됨!! &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;a href=&quot;https://start.spring.io&quot;&gt;https://start.spring.io&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;미리 막 이것저것 추가하면 안 되겠다는 것을 경험함 끝. &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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://fors.tistory.com/386&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://fors.tistory.com/386&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1693212328900&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;스프링부트 springboot mvn build test error 에러 해결&quot; data-og-description=&quot;관련 글의 stackoverflow 링크 https://stackoverflow.com/questions/13170860/failed-to-execute-goal-org-apache-maven-pluginsmaven-surefire-plugin2-10test 링크를 타고 들어가면 다양한 답변이 나온다. 그 중에서 몇가지를 소개한&quot; data-og-host=&quot;fors.tistory.com&quot; data-og-source-url=&quot;https://fors.tistory.com/386&quot; data-og-url=&quot;https://fors.tistory.com/386&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bKXogA/hyTINGEEeE/2WaY38xcrEd8WiIgbbiml1/img.png?width=800&amp;amp;height=563&amp;amp;face=0_0_800_563,https://scrap.kakaocdn.net/dn/c07tXQ/hyTL7Dteek/DEza0losamIdFASiTr1wJ0/img.png?width=800&amp;amp;height=563&amp;amp;face=0_0_800_563,https://scrap.kakaocdn.net/dn/bRkxUs/hyTL9uxs6w/Aq4lnOu8SShK6r8XnkJMO0/img.png?width=878&amp;amp;height=618&amp;amp;face=0_0_878_618&quot;&gt;&lt;a href=&quot;https://fors.tistory.com/386&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://fors.tistory.com/386&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bKXogA/hyTINGEEeE/2WaY38xcrEd8WiIgbbiml1/img.png?width=800&amp;amp;height=563&amp;amp;face=0_0_800_563,https://scrap.kakaocdn.net/dn/c07tXQ/hyTL7Dteek/DEza0losamIdFASiTr1wJ0/img.png?width=800&amp;amp;height=563&amp;amp;face=0_0_800_563,https://scrap.kakaocdn.net/dn/bRkxUs/hyTL9uxs6w/Aq4lnOu8SShK6r8XnkJMO0/img.png?width=878&amp;amp;height=618&amp;amp;face=0_0_878_618');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;스프링부트 springboot mvn build test error 에러 해결&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;관련 글의 stackoverflow 링크 https://stackoverflow.com/questions/13170860/failed-to-execute-goal-org-apache-maven-pluginsmaven-surefire-plugin2-10test 링크를 타고 들어가면 다양한 답변이 나온다. 그 중에서 몇가지를 소개한&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fors.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://haenny.tistory.com/298&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://haenny.tistory.com/298&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1693212754914&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Failed to determine a suitable driver class 오류 해결&quot; data-og-description=&quot;오류 로그 ********************************* APPLICATION FAILED TO START ********************************* Description: Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. Reason: Failed to &quot; data-og-host=&quot;haenny.tistory.com&quot; data-og-source-url=&quot;https://haenny.tistory.com/298&quot; data-og-url=&quot;https://haenny.tistory.com/298&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/e3QBd/hyTMirti3f/Mm3hQOwsjHnwWKGk4wI05K/img.png?width=800&amp;amp;height=799&amp;amp;face=0_0_800_799,https://scrap.kakaocdn.net/dn/jVbpU/hyTIMVhnTW/OaBJSNMtOktlOpVaYneLpk/img.png?width=800&amp;amp;height=799&amp;amp;face=0_0_800_799,https://scrap.kakaocdn.net/dn/mxhop/hyTINfAI3r/8qq2kbRujDoGHyizVuQN3K/img.jpg?width=540&amp;amp;height=540&amp;amp;face=125_50_432_424&quot;&gt;&lt;a href=&quot;https://haenny.tistory.com/298&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://haenny.tistory.com/298&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/e3QBd/hyTMirti3f/Mm3hQOwsjHnwWKGk4wI05K/img.png?width=800&amp;amp;height=799&amp;amp;face=0_0_800_799,https://scrap.kakaocdn.net/dn/jVbpU/hyTIMVhnTW/OaBJSNMtOktlOpVaYneLpk/img.png?width=800&amp;amp;height=799&amp;amp;face=0_0_800_799,https://scrap.kakaocdn.net/dn/mxhop/hyTINfAI3r/8qq2kbRujDoGHyizVuQN3K/img.jpg?width=540&amp;amp;height=540&amp;amp;face=125_50_432_424');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Failed to determine a suitable driver class 오류 해결&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;오류 로그 ********************************* APPLICATION FAILED TO START ********************************* Description: Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. Reason: Failed to&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;haenny.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 모드/오류처리</category>
      <category>error</category>
      <category>maven</category>
      <category>Spring Boot</category>
      <category>test error</category>
      <category>에러</category>
      <category>테스트 에러</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/38</guid>
      <comments>https://precious-value.tistory.com/38#entry38comment</comments>
      <pubDate>Mon, 28 Aug 2023 17:59:00 +0900</pubDate>
    </item>
    <item>
      <title>AI 챗봇 사용법(feat. Chat GPT, Bard, HyperCLOVA X)</title>
      <link>https://precious-value.tistory.com/37</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;금일 네이버에서 하이퍼 클로바라는 초거대 AI를 출시해서 핫하길래&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;겸사겸사 다른 AI 챗봇 사용법을 정리해 봄. &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;b&gt;1. Chat GPT(챗 GPT)&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;거의 모든 AI 챗봇 사이트가 그렇듯이 사용방법은 매우 간단함.&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;a href=&quot;https://chat.openai.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://chat.openai.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1692863094739&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ChatGPT&quot; data-og-description=&quot;A conversational AI system that listens, learns, and challenges&quot; data-og-host=&quot;chat.openai.com&quot; data-og-source-url=&quot;https://chat.openai.com/&quot; data-og-url=&quot;https://chat.openai.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mxnWL/hyTIG0R3k7/fL5NyodIB6BO5ZoUeYwTMK/img.png?width=1600&amp;amp;height=900&amp;amp;face=0_0_1600_900&quot;&gt;&lt;a href=&quot;https://chat.openai.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://chat.openai.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mxnWL/hyTIG0R3k7/fL5NyodIB6BO5ZoUeYwTMK/img.png?width=1600&amp;amp;height=900&amp;amp;face=0_0_1600_900');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ChatGPT&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A conversational AI system that listens, learns, and challenges&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;chat.openai.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사이트에 접속 후 Log In 버튼 클릭!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;817&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mkUFt/btssabGDViR/U39RUrT30mGKOX1h86AuY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mkUFt/btssabGDViR/U39RUrT30mGKOX1h86AuY0/img.png&quot; data-alt=&quot;출처 : Chat GPT 홈페이지(https://chat.openai.com/)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mkUFt/btssabGDViR/U39RUrT30mGKOX1h86AuY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmkUFt%2FbtssabGDViR%2FU39RUrT30mGKOX1h86AuY0%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; alt=&quot;Chat Gpt&quot; loading=&quot;lazy&quot; width=&quot;356&quot; height=&quot;449&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;817&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : Chat GPT 홈페이지(https://chat.openai.com/)&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;필자는 구글 연동하였는데 아무거나 연동하여 로그인하시면 됨!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;933&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GtITL/btssaBSCupD/DJpyKffHS7C08dr2rsrrnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GtITL/btssaBSCupD/DJpyKffHS7C08dr2rsrrnk/img.png&quot; data-alt=&quot;출처 : Chat GPT 홈페이지(https://chat.openai.com/)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GtITL/btssaBSCupD/DJpyKffHS7C08dr2rsrrnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGtITL%2FbtssaBSCupD%2FDJpyKffHS7C08dr2rsrrnk%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; alt=&quot;Chat GPT2&quot; loading=&quot;lazy&quot; width=&quot;483&quot; height=&quot;933&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;933&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : Chat GPT 홈페이지(https://chat.openai.com/)&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;짜잔~ 이제 궁금한 점을 Chat GPT에게 물어보면 끝 &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;필자는 무료버전(GPT-3.5)을 사용하지만, 유료로 업그레이드를 하면 속도 UP!!&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0tO4y/btsrZABdyS6/jeuxdkyYG9y2eVOVUDdpKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0tO4y/btsrZABdyS6/jeuxdkyYG9y2eVOVUDdpKk/img.png&quot; data-alt=&quot;출처 : Chat GPT 홈페이지(https://chat.openai.com/)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0tO4y/btsrZABdyS6/jeuxdkyYG9y2eVOVUDdpKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0tO4y%2FbtsrZABdyS6%2FjeuxdkyYG9y2eVOVUDdpKk%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; alt=&quot;Chat GPT 3&quot; loading=&quot;lazy&quot; width=&quot;471&quot; height=&quot;268&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : Chat GPT 홈페이지(https://chat.openai.com/)&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;이건 미세먼지 팁인데 좌측 하단에... 표시를 클릭 &amp;gt; settings 클릭하면&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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;b&gt;2. Bard(바드)&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;찾아본 정보에 의하면 바드가 Chat GPT 무료버전보다 많은 매개변수를 바탕으로 만들어져&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;사용해 보면 체감은 잘 안됨. 하지만 바드는 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;상황에 맞게 그걸 선택해서 사용할 수 있다는 장점이 있음.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bard.google.com&quot;&gt;https://bard.google.com&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1692863979089&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;https://bard.google.com&quot; data-og-description=&quot;&quot; data-og-host=&quot;bard.google.com&quot; data-og-source-url=&quot;https://bard.google.com&quot; data-og-url=&quot;https://bard.google.com&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://bard.google.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bard.google.com&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;https://bard.google.com&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bard.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1839&quot; data-origin-height=&quot;927&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvGWp2/btssarJpKnm/tNZEypvMcYyGuByZUhx2K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvGWp2/btssarJpKnm/tNZEypvMcYyGuByZUhx2K1/img.png&quot; data-alt=&quot;출처 : Bard 홈페이지(https://bard.google.com)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvGWp2/btssarJpKnm/tNZEypvMcYyGuByZUhx2K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvGWp2%2FbtssarJpKnm%2FtNZEypvMcYyGuByZUhx2K1%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; alt=&quot;BARD&quot; loading=&quot;lazy&quot; width=&quot;678&quot; height=&quot;927&quot; data-origin-width=&quot;1839&quot; data-origin-height=&quot;927&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : Bard 홈페이지(https://bard.google.com)&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;짜잔~ 위와 같은 화면이 나오고, 이제 바드와 진실의 면담시간 &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;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-bgNkRlaixC7lEMjU&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #009a87;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;b&gt;3. Hyper CLOVA X(하이퍼클로바 X)&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대망의 네이버에서 만든 따끈따끈한 하이퍼 클로바 X&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;하지만 Chat GPT의 한국어 학습량 6500배에 달하는 한국형 AI인 점,&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;네이버 뉴스 50년 치, 블로그 9년 치, 지식인 데이터를 학습했다는 점 등의 장점이 있다고 하니&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;&lt;a href=&quot;https://clova-x.naver.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://clova-x.naver.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1692864703110&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;CLOVA X&quot; data-og-description=&quot;무한한 가능성을 여는 새로운 대화의 시작&quot; data-og-host=&quot;clova-x.naver.com&quot; data-og-source-url=&quot;https://clova-x.naver.com/&quot; data-og-url=&quot;https://clova-x.naver.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/0yrFx/hyTILVptrM/SY4unR6cddVuAagm72IEq0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://clova-x.naver.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://clova-x.naver.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/0yrFx/hyTILVptrM/SY4unR6cddVuAagm72IEq0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;CLOVA X&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;무한한 가능성을 여는 새로운 대화의 시작&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;clova-x.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;시작하기 버튼 클릭 후 네이버 로그인하면 끝!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1758&quot; data-origin-height=&quot;951&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLYVjZ/btsr9N0go4d/sjTcjRO2HhNvuKglikvdd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLYVjZ/btsr9N0go4d/sjTcjRO2HhNvuKglikvdd1/img.png&quot; data-alt=&quot;출처 : 하이퍼 클로바X(https://clova-x.naver.com/)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLYVjZ/btsr9N0go4d/sjTcjRO2HhNvuKglikvdd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLYVjZ%2Fbtsr9N0go4d%2FsjTcjRO2HhNvuKglikvdd1%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; alt=&quot;하이퍼 클로바&quot; loading=&quot;lazy&quot; width=&quot;692&quot; height=&quot;951&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1758&quot; data-origin-height=&quot;951&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 하이퍼 클로바X(https://clova-x.naver.com/)&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;이것저것 테스트로 검색해 보니 나쁘진 않은 것 같음.&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IUI5Z/btsrZzh1HGN/LRI2TMtioJR0QzSBgy8NF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IUI5Z/btsrZzh1HGN/LRI2TMtioJR0QzSBgy8NF0/img.png&quot; data-alt=&quot;출처 : 하이퍼 클로바X(https://clova-x.naver.com/)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IUI5Z/btsrZzh1HGN/LRI2TMtioJR0QzSBgy8NF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIUI5Z%2FbtsrZzh1HGN%2FLRI2TMtioJR0QzSBgy8NF0%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; alt=&quot;하이퍼 클로바2&quot; loading=&quot;lazy&quot; width=&quot;642&quot; height=&quot;192&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;192&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 하이퍼 클로바X(https://clova-x.naver.com/)&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;그리고 위 사진처럼 스킬을 사용할 수 있다는데&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;네이버 여행의 최신 정보를 연동하여 여행 상품 정보 추천 등을 받아볼 수 있다고 함.&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;네이버에서 개발한 하이퍼 클로바는 국내 기업 최초의 초거대 AI라서&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;필자는 관심이 생겼는데 앞으로 Chat GPT 안 쓰고 하이퍼클로바를 쓸 수 있을지 의문!!&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;이상 하이퍼 클로바 출시기념 간단하게 AI 챗봇 사용법 적어봤음. 끝. &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;
&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;a href=&quot;https://terms.naver.com/entry.naver?docId=6449367&amp;amp;cid=43667&amp;amp;categoryId=43667&quot;&gt;https://terms.naver.com/entry.naver?docId=6449367&amp;amp;cid=43667&amp;amp;categoryId=43667&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1692865315731&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;하이퍼클로바&quot; data-og-description=&quot;국내 최대 포털&amp;nbsp;네이버가 개발한 국내 기업 최초의 초대규모(Hyperscale)&amp;nbsp;인공지능(AI)으로, 2021년&amp;nbsp;5월&amp;nbsp;25일 공개됐다.&amp;nbsp;이는 일론 머스크의&amp;nbsp;'오픈(Open)AI'가 2020년 공개한 초거대&amp;nbsp;AI 'GPT-3'보다 그 규&quot; data-og-host=&quot;terms.naver.com&quot; data-og-source-url=&quot;https://terms.naver.com/entry.naver?docId=6449367&amp;amp;cid=43667&amp;amp;categoryId=43667&quot; data-og-url=&quot;https://terms.naver.com/entry.naver?cid=43667&amp;amp;categoryId=43667&amp;amp;docId=6449367&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nQjSw/hyTIP4zFy4/iZNNvw2TLmRi7WThJfMGS0/img.jpg?width=540&amp;amp;height=313&amp;amp;face=0_0_540_313,https://scrap.kakaocdn.net/dn/FjgJg/hyTIEorBGg/gui3ZVz3NKm1VNtG46INZ0/img.png?width=20&amp;amp;height=19&amp;amp;face=0_0_20_19&quot;&gt;&lt;a href=&quot;https://terms.naver.com/entry.naver?docId=6449367&amp;amp;cid=43667&amp;amp;categoryId=43667&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://terms.naver.com/entry.naver?docId=6449367&amp;amp;cid=43667&amp;amp;categoryId=43667&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nQjSw/hyTIP4zFy4/iZNNvw2TLmRi7WThJfMGS0/img.jpg?width=540&amp;amp;height=313&amp;amp;face=0_0_540_313,https://scrap.kakaocdn.net/dn/FjgJg/hyTIEorBGg/gui3ZVz3NKm1VNtG46INZ0/img.png?width=20&amp;amp;height=19&amp;amp;face=0_0_20_19');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;하이퍼클로바&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;국내 최대 포털&amp;nbsp;네이버가 개발한 국내 기업 최초의 초대규모(Hyperscale)&amp;nbsp;인공지능(AI)으로, 2021년&amp;nbsp;5월&amp;nbsp;25일 공개됐다.&amp;nbsp;이는 일론 머스크의&amp;nbsp;'오픈(Open)AI'가 2020년 공개한 초거대&amp;nbsp;AI 'GPT-3'보다 그 규&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;terms.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 모드/개념</category>
      <category>Ai</category>
      <category>bard</category>
      <category>ChatGPT</category>
      <category>구글</category>
      <category>네이버</category>
      <category>챗봇</category>
      <category>하이퍼클로바X</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/37</guid>
      <comments>https://precious-value.tistory.com/37#entry37comment</comments>
      <pubDate>Thu, 24 Aug 2023 17:24:37 +0900</pubDate>
    </item>
    <item>
      <title>[Java/Spring]numbers of source raster bands and source color space components do not match</title>
      <link>https://precious-value.tistory.com/36</link>
      <description>&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;/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;알고 보니 썸네일을 생성하는 코드 쪽에서 이미지를 읽어오는데 위와 같은 에러가 발생함.&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;갓글의 힘을 빌려 검색을 해보니 이미지에는 확장자 말고 타입이란 게 있는데,&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;RGB 또는 CMYK 등이 있다고 함.&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;근데 내가 읽으려고 하는 파일이 CMYK 타입의 이미지였던 것!&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;div style=&quot;background-color: #282c34; color: #abb2bf;&quot;&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;BufferedImage srcImg = ImageIO.read('읽으려는 파일 경로');&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드 부분에서 CMYK 타입의 이미지를 읽으려다 에러가 발생한 것!&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;POM.xml 파일에&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #282c34; color: #abb2bf;&quot;&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;com.twelvemonkeys.imageio&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;imageio-jpeg&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;3.7.0&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;com.twelvemonkeys.imageio&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;imageio-tiff&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;3.7.0&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 추가하여 Maven reload를 하면 문제없이 파일을 읽어올 수 있음!! &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 라이브러리가 CMYK 타입의 이미지도 읽어올 수 있도록 해주는 것 같음 &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;&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;a href=&quot;https://blog.naver.com/yeolimprinting/222416447379&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blog.naver.com/yeolimprinting/222416447379&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1692680034656&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;쉽고 빠르게 알아보는 RGB와 CMYK의 차이점!&quot; data-og-description=&quot;쉽고 빠르게 알아보는 RGB와 CMYK의 차이점 인쇄소에 파일을 전달하기 전 필수로 작업해야 하는 내...&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://blog.naver.com/yeolimprinting/222416447379&quot; data-og-url=&quot;https://blog.naver.com/yeolimprinting/222416447379&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/O6MNY/hyTFmoHPSI/76f3NV0QhTmWEbqq8CpZX0/img.jpg?width=735&amp;amp;height=735&amp;amp;face=0_0_735_735&quot;&gt;&lt;a href=&quot;https://blog.naver.com/yeolimprinting/222416447379&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.naver.com/yeolimprinting/222416447379&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/O6MNY/hyTFmoHPSI/76f3NV0QhTmWEbqq8CpZX0/img.jpg?width=735&amp;amp;height=735&amp;amp;face=0_0_735_735');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;쉽고 빠르게 알아보는 RGB와 CMYK의 차이점!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;쉽고 빠르게 알아보는 RGB와 CMYK의 차이점 인쇄소에 파일을 전달하기 전 필수로 작업해야 하는 내...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://madinthe90.tistory.com/67&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://madinthe90.tistory.com/67&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1692680043844&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[JAVA/SPRING] javax.imageio.IIOException: Unsupported Image Type (CMYK 이미지 오류)&quot; data-og-description=&quot;파일 업로드 중 오류가 발생한다는 사항이 발생해 확인해보았다. 아래와 같은 에러가 발생하였고, 찾아보니 이미지 파일 업로드 시 썸네일을 생성하는데 썸네일 생성 시 ImageIO.read()로 CMYK 타입 &quot; data-og-host=&quot;madinthe90.tistory.com&quot; data-og-source-url=&quot;https://madinthe90.tistory.com/67&quot; data-og-url=&quot;https://madinthe90.tistory.com/67&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Gk6Z9/hyTFbnaMEc/Ty3LX2CJ3OhUBI4jUvczFk/img.png?width=378&amp;amp;height=378&amp;amp;face=0_0_378_378,https://scrap.kakaocdn.net/dn/lysaw/hyTIJbs0Ih/UAA9qxqMpt3df4rSl2ShE1/img.png?width=378&amp;amp;height=378&amp;amp;face=0_0_378_378,https://scrap.kakaocdn.net/dn/bZvNZj/hyTFqxS2G2/ZJDNSMrjKJ5FY4Vd9eYQQ1/img.png?width=378&amp;amp;height=378&amp;amp;face=0_0_378_378&quot;&gt;&lt;a href=&quot;https://madinthe90.tistory.com/67&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://madinthe90.tistory.com/67&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Gk6Z9/hyTFbnaMEc/Ty3LX2CJ3OhUBI4jUvczFk/img.png?width=378&amp;amp;height=378&amp;amp;face=0_0_378_378,https://scrap.kakaocdn.net/dn/lysaw/hyTIJbs0Ih/UAA9qxqMpt3df4rSl2ShE1/img.png?width=378&amp;amp;height=378&amp;amp;face=0_0_378_378,https://scrap.kakaocdn.net/dn/bZvNZj/hyTFqxS2G2/ZJDNSMrjKJ5FY4Vd9eYQQ1/img.png?width=378&amp;amp;height=378&amp;amp;face=0_0_378_378');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[JAVA/SPRING] javax.imageio.IIOException: Unsupported Image Type (CMYK 이미지 오류)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;파일 업로드 중 오류가 발생한다는 사항이 발생해 확인해보았다. 아래와 같은 에러가 발생하였고, 찾아보니 이미지 파일 업로드 시 썸네일을 생성하는데 썸네일 생성 시 ImageIO.read()로 CMYK 타입&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;madinthe90.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 모드/오류처리</category>
      <category>CMYK</category>
      <category>에러</category>
      <category>이미지 에러</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/36</guid>
      <comments>https://precious-value.tistory.com/36#entry36comment</comments>
      <pubDate>Tue, 22 Aug 2023 14:02:14 +0900</pubDate>
    </item>
    <item>
      <title>[docker]Tomcat9 설치하기(2)(feat. 폐쇄망)</title>
      <link>https://precious-value.tistory.com/35</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://precious-value.tistory.com/34&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.06.27 - [개발자 모드/개념] - [docker] CentOs7에 JDK설치하기(1)(feat. 폐쇄망)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1687933144376&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[docker]Web 서버와 Was 서버 만들기(1)(feat. 폐쇄망)&quot; data-og-description=&quot;이번에 폐쇄망으로 된 Web 서버 및 Was 서버를 세팅할 일이 있어서 그전에 도커로 미리 연습 및 정리할 겸 이 글을 작성하게 됨.  이 글의 방향 설명 필자는 CentOs7 버전의 docker Image를 가져와 컨테&quot; data-og-host=&quot;precious-value.tistory.com&quot; data-og-source-url=&quot;https://precious-value.tistory.com/34&quot; data-og-url=&quot;https://precious-value.tistory.com/34&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/MMI0L/hyS8zocSs5/zx5SwqkHZe3HNZRwZLBTh1/img.png?width=800&amp;amp;height=788&amp;amp;face=0_0_800_788,https://scrap.kakaocdn.net/dn/cEZmdG/hyS9OcZ2hM/PbUHmdMQ4g05Z0HAtKtMv0/img.png?width=800&amp;amp;height=788&amp;amp;face=0_0_800_788,https://scrap.kakaocdn.net/dn/eJohAm/hyS8rDKI8a/ASIaaJFbPwBDGIkE6kBik0/img.png?width=600&amp;amp;height=419&amp;amp;face=0_0_600_419&quot;&gt;&lt;a href=&quot;https://precious-value.tistory.com/34&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://precious-value.tistory.com/34&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/MMI0L/hyS8zocSs5/zx5SwqkHZe3HNZRwZLBTh1/img.png?width=800&amp;amp;height=788&amp;amp;face=0_0_800_788,https://scrap.kakaocdn.net/dn/cEZmdG/hyS9OcZ2hM/PbUHmdMQ4g05Z0HAtKtMv0/img.png?width=800&amp;amp;height=788&amp;amp;face=0_0_800_788,https://scrap.kakaocdn.net/dn/eJohAm/hyS8rDKI8a/ASIaaJFbPwBDGIkE6kBik0/img.png?width=600&amp;amp;height=419&amp;amp;face=0_0_600_419');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[docker]Web 서버와 Was 서버 만들기(1)(feat. 폐쇄망)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이번에 폐쇄망으로 된 Web 서버 및 Was 서버를 세팅할 일이 있어서 그전에 도커로 미리 연습 및 정리할 겸 이 글을 작성하게 됨.  이 글의 방향 설명 필자는 CentOs7 버전의 docker Image를 가져와 컨테&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;precious-value.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tomcat9 설치 경로 : &lt;a href=&quot;https://tomcat.apache.org/download-90.cgi&quot;&gt;https://tomcat.apache.org/download-90.cgi&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1687929200058&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Apache Tomcat&amp;reg; - Apache Tomcat 9 Software Downloads&quot; data-og-description=&quot;Welcome to the Apache Tomcat&amp;reg; 9.x software download page. This page provides download links for obtaining the latest version of Tomcat 9.0.x software, as well as links to the archives of older releases. Unsure which version you need? Specification version&quot; data-og-host=&quot;tomcat.apache.org&quot; data-og-source-url=&quot;https://tomcat.apache.org/download-90.cgi&quot; data-og-url=&quot;https://tomcat.apache.org/download-90.cgi&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://tomcat.apache.org/download-90.cgi&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tomcat.apache.org/download-90.cgi&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Apache Tomcat&amp;reg; - Apache Tomcat 9 Software Downloads&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Welcome to the Apache Tomcat&amp;reg; 9.x software download page. This page provides download links for obtaining the latest version of Tomcat 9.0.x software, as well as links to the archives of older releases. Unsure which version you need? Specification version&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tomcat.apache.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저번 시간엔 컨테이너를 띄우고 그 컨테이너에 openJDK1.8 설치 후 환경변수 설정까지 완료했고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 시간엔 그 컨테이너에 Tomcat9를 설치해 볼 예정(jdk 설치가 안되신 분은 상단 링크 클릭!)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진행하기 앞서 저번 시간에 만들어 놓은 컨테이너에 JDK 설치 및 환경변수 설정까지 마쳤다면&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt; 도커 컨테이너 이미지화 명령어&lt;br /&gt;docker commit 컨테이너명 생성할 이미지명&amp;nbsp;&lt;/blockquote&gt;
&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;중간 세이브처럼 설정한 부분부터 다시 시작할 수 있기 때문에  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 필자는 어느 정도 설정이 되었다면 이미지로 커밋함(꿀팁 )&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;1. Tomcat9 설치&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에도 폐쇄망이라는 가정하에 tar 아카이브 파일을 미리 설정해 둔 공유 폴더(경로 : /home/app)에 세팅해 놓았음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Tomcat9 다운로드 링크는 상단에 있음 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tomcat9를 풀 폴더를 먼저 생성해 줌.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mkdir /was/tomcat9-ui&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; tar 아카이브 파일을 해제 명령어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tar zxvf apache-tomcat-9.0.71.tar.gz -C /was/tomcat9-ui/ --strip-components 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; 명령어 상세설명은 &lt;a href=&quot;https://precious-value.tistory.com/34&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.06.27 - [개발자 모드/개념] - [docker] CentOs7에 JDK설치하기(1)(feat. 폐쇄망)&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;555&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XF3mC/btslFk5ixhD/if8e7ZSlzsCXKgbD1i72E0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XF3mC/btslFk5ixhD/if8e7ZSlzsCXKgbD1i72E0/img.png&quot; data-alt=&quot;tomcat9 tar 아카이브 파일 해제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XF3mC/btslFk5ixhD/if8e7ZSlzsCXKgbD1i72E0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXF3mC%2FbtslFk5ixhD%2Fif8e7ZSlzsCXKgbD1i72E0%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;390&quot; height=&quot;243&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;tomcat9 tar 아카이브 파일 해제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;2. Tomcat9 포트설정&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 톰켓 서버 설정에서 포트를 바꿔주면 접속할 수 있음!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트 설정을 변경하기 위해 server.xml 파일을 vi 편집기로 실행해 줌.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vi /was/tomcat9-ui/conf/server.xml&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:set number : 줄번호 보기 명령어(필자관점 꿀팁 )&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-bgNkRlaixC7lEMjU&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 톰켓을 3개 띄울 생각이기에 첫 번째 톰켓에 해당되는 tomcat9-ui는 69번째 줄의 포트만 변경하면 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(줄번호는 다를 수도 있음 / 이해를 돕기 위해서 참고용으로만 봐주시길 )&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boKtFu/btslRQWKBOo/gGZkE79IZmAh7RO0NTUem1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boKtFu/btslRQWKBOo/gGZkE79IZmAh7RO0NTUem1/img.png&quot; data-alt=&quot;server.xml 코드 일부분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boKtFu/btslRQWKBOo/gGZkE79IZmAh7RO0NTUem1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboKtFu%2FbtslRQWKBOo%2FgGZkE79IZmAh7RO0NTUem1%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;467&quot; height=&quot;57&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;server.xml 코드 일부분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 사진처럼 포트를 컨테이너 실행 시 설정해 주었던 -p 옵션의 컨테이너 포트로 설정해 주면 됨!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(모르시는 분들을 위해 필자는 -p 18887:18887 -p 18888:18888 -p 18889:18889로 3개의 포트를 설정했음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 필자처럼 2개 이상의 톰켓 구조를 가져간다면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;22&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bisfzq/btslSpj0SLO/OGJxTZRmDSbpnxJVEwblS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bisfzq/btslSpj0SLO/OGJxTZRmDSbpnxJVEwblS0/img.png&quot; data-alt=&quot;server.xml 코드 일부분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bisfzq/btslSpj0SLO/OGJxTZRmDSbpnxJVEwblS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbisfzq%2FbtslSpj0SLO%2FOGJxTZRmDSbpnxJVEwblS0%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;410&quot; height=&quot;22&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;22&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;server.xml 코드 일부분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 사진처럼 shutdown 포트도 수정해줘야 함.(default 포트는 8005이지만 중복이 되면 안 됨!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 포트설정을 마쳤다면 저장 후 종료 :wq&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번째 톰켓은 shutdown 포트 8006, Connector 포트는 18888&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3번째 톰켓은 shutdown 포트 8007, Connector 포트는 18889로 설정함 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( 포트는 8080, 80이든 자유롭게 설정이 가능하지만 많이 쓰는 포트보다 잘 안 쓰는 포트로 설정해 놓는 것이 중복될 일도 없고 보안상 좋다기에 18888 같은 포트를 사용했음 )&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;3. Tomcat9 실행&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 톰켓을 실행시켜 보겠음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cd /was/tomcat9-ui/bin&amp;nbsp; 경로로 이동&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;./shutdown.sh : 톰켓 종료 shell 스크립트&lt;br /&gt;./startup.sh : 톰켓 구동 shell 스크립트&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;startup 쉘 스크립트를 실행하면 톰켓이 구동이 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 크롬을 켜서 주소창에 localhost:18887을 입력!!&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;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;4. war 배포&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&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;배포할 프로젝트를 빌드하면 war 파일이 나올 텐데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/was/tomcat9-ui/webapps 폴더에 있던 파일들을 삭제하고 war파일을 경로에 넣어줌.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;war 파일 명이 ROOT.war이면 localhost:18887로 접속하면 되고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 파일 명이면(ex test.war) localhost:18887/test로 접속하면 시스템이 잘 올라오는 것을 확인할 수 있을 거임!! &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시나 안 올라온다면 logs폴더 안에 로그를 확인해서 에러를 확인해 보고 잡기(개발 자니까!) &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhCKGu/btslZEIi52S/CHqv90E6bNkXGTOUA5k7V1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhCKGu/btslZEIi52S/CHqv90E6bNkXGTOUA5k7V1/img.png&quot; data-alt=&quot;tomcat9의 webapps 폴더&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhCKGu/btslZEIi52S/CHqv90E6bNkXGTOUA5k7V1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhCKGu%2FbtslZEIi52S%2FCHqv90E6bNkXGTOUA5k7V1%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;514&quot; height=&quot;117&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;tomcat9의 webapps 폴더&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>개발자 모드/개념</category>
      <category>Docker</category>
      <category>tomcat9</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/35</guid>
      <comments>https://precious-value.tistory.com/35#entry35comment</comments>
      <pubDate>Thu, 29 Jun 2023 17:09:47 +0900</pubDate>
    </item>
    <item>
      <title>[docker]JDK1.8 설치하기(1)(feat. 폐쇄망)</title>
      <link>https://precious-value.tistory.com/34</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 폐쇄망으로 된 Web 서버 및 Was 서버를 세팅할 일이 있어서&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; 이 글의 방향 설명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 CentOs7 버전의 docker Image를 가져와 컨테이너 2개를 띄워&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나는 Web 서버, 하나는 Was 서버로 세팅할 생각임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Was 서버는 톰켓을 3개 띄우고, Web 서버는 nginx를 설치하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Web 서버로 접속해 Was 서버의 톰켓 화면(index.jsp)를 띄우는 게&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;최종 목표임.&lt;/span&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;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시작하기 전 말씀드리지만 도커로 환경세팅을 하기 때문에 도커 데스크톱이 미리 설치되어있어야 함!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker desktop 설치경로 : &lt;a href=&quot;https://www.docker.com/products/docker-desktop/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.docker.com/products/docker-desktop/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1687761520230&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Download Docker Desktop | Docker&quot; data-og-description=&quot;Docker Desktop is available to download for free on Mac, Windows, or Linux operating systems. Get started with Docker today!&quot; data-og-host=&quot;www.docker.com&quot; data-og-source-url=&quot;https://www.docker.com/products/docker-desktop/&quot; data-og-url=&quot;https://www.docker.com/products/docker-desktop/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c5Ge2a/hyS8kiKhm6/evIktrm1kcJI4xsOQoLbLK/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580,https://scrap.kakaocdn.net/dn/hrZ7m/hyS8tzZKR9/ArDNdSCCdJ15DvWDZdku7K/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580&quot;&gt;&lt;a href=&quot;https://www.docker.com/products/docker-desktop/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.docker.com/products/docker-desktop/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c5Ge2a/hyS8kiKhm6/evIktrm1kcJI4xsOQoLbLK/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580,https://scrap.kakaocdn.net/dn/hrZ7m/hyS8tzZKR9/ArDNdSCCdJ15DvWDZdku7K/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Download Docker Desktop | Docker&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Docker Desktop is available to download for free on Mac, Windows, or Linux operating systems. Get started with Docker today!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.docker.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;openjdk 1.8 다운로드 경로 :&amp;nbsp;&lt;a href=&quot;https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries/releases&quot;&gt;https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries/releases&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1687848328885&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Releases &amp;middot; AdoptOpenJDK/openjdk8-upstream-binaries&quot; data-og-description=&quot;Archived release scripts/releases of OpenJDK 8u project builds. Superseded by Eclipse Temurin releases. - AdoptOpenJDK/openjdk8-upstream-binaries&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries/releases&quot; data-og-url=&quot;https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries/releases&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/x7Twf/hyS8pLTPcN/TWQkdtiZYClXUxwXSj2cd1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries/releases&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/x7Twf/hyS8pLTPcN/TWQkdtiZYClXUxwXSj2cd1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Releases &amp;middot; AdoptOpenJDK/openjdk8-upstream-binaries&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Archived release scripts/releases of OpenJDK 8u project builds. Superseded by Eclipse Temurin releases. - AdoptOpenJDK/openjdk8-upstream-binaries&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;1. 도커 컨테이너 생성&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt; 컨테이너 생성은 필자처럼 커맨드로 해도 되고 다른 방법을 사용해도 무관!&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;#버전정보&lt;br /&gt;- CentOs7&lt;br /&gt;- Open JDK 1.8&lt;br /&gt;- Tomcat 9&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커를 실행한 상태로 cmd를 켜고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker pull centos(이미지명):7(버전) 를 치면 centos7 image가 다운받아짐.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;143&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFHA90/btsltkqnsLk/aKshduckmnlsZetWpkd8h1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFHA90/btsltkqnsLk/aKshduckmnlsZetWpkd8h1/img.png&quot; data-alt=&quot;이미지 다운받은 화면(다른 이미지는 신경안써도 됨)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFHA90/btsltkqnsLk/aKshduckmnlsZetWpkd8h1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFHA90%2FbtsltkqnsLk%2FaKshduckmnlsZetWpkd8h1%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;695&quot; height=&quot;143&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;143&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; 컨테이너 실행 명령어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker run -d -it --name centos_was -v C:/Users/사용자/Desktop/tmp:/home/app -p 18887:18887 -p 18888:18888 -p 18889:18889 --privileged centos:7 /sbin/init&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;컨테이너 실행 옵션 설명&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;#&amp;nbsp;&lt;span style=&quot;background-color: #666666; color: #ffffff;&quot;&gt; -it&amp;nbsp; &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&amp;nbsp;: 컨테이너를 종료하지 않은 채로, 터미널의 입력을 계속해서 컨테이너로 전달&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;#&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #666666; color: #ffffff;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;-d &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt; : &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;컨테이너를 백그라운드에서 실행할 때 쓰는 명령어&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&amp;gt;&amp;gt;컨테이너가 detached 모드에서 실행되며, 실행 결과로 컨테이너 ID만 출력&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;#&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #666666; color: #ffffff;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;-v &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt; : 공유 디렉터리를 설정할 때 쓰는 명령어 / etc) -v 호스트 파일경로:컨테이너 파일경로&lt;br /&gt;&amp;gt;&amp;gt;볼륨 옵션을 사용하면 설정한 폴더를 공유하기 때문에 컨테이너로 필요한 파일을 복사할 필요가 없음.&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;#&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #666666; color: #ffffff;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;--name &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 컨테이너명을 설정할 때 쓰는 명령어&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;#&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #666666; color: #ffffff;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;-e &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: docker 컨테이너의 환경변수를 설정할 때 쓰는 명령어(필자는 쓰지 않았음)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;#&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #666666; color: #ffffff;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;-p &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 호스트와 컨테이너 간의 포트 배포/바인드를 위해서 사용되며, 호스트 컴퓨터에서 컨테이너로 리스닝하고 있는 포트로 접속할 수 있도록 설정해 줌.(필자처럼 여러 포트 설정 가능)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;#&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #666666; color: #ffffff;&quot;&gt;&lt;span&gt;&amp;nbsp;--privileged ...&lt;/span&gt; /sbin/init &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: systemctl를 정상적으로 실행할 수 있게 해 주는 명령어&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&amp;gt;&amp;gt;일반적으로 생성한 컨테이너는 호스트 시스템의 주요 자원에 접근할 수 없지만 이 명령어를 선언해 주면 접근 가능함&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;#&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #666666; color: #ffffff;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;--hostname &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 컨테이너에 접속했을 때 호스트명을 설정하고 싶으면 쓰는 명령어(필자는 쓰지 않았음)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어로 컨테이너를 만들고 실행시켰다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker ps를 쳤을 때 만든 컨테이너가 실행되고 있는 것을 볼 수 있음.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt; 쓸만한 도커 컨테이너 관련 명령어(필자 주관적 )&lt;br /&gt;- docker ps : 실행 중인 컨테이너 목록 조회 / 모든 컨테이너 조회하고 싶으면 -a 옵션 추가&lt;br /&gt;- docker exec -it 컨테이너명 /bin/bash : 선언한 컨테이너의 터미널 접속 명령어&lt;br /&gt;- docker rm 컨테이너명 : 해당 컨테이너 삭제 / 단, 실행 중인 컨테이너를 삭제하고 싶으면 -f 옵션 추가&lt;/blockquote&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-bgNkRlaixC7lEMjU&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;2. OpenJDK1.8 설치&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너의 터미널에 접속한 후 /home/app 경로로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 미리 받아놓은 OpenJDK1.8 tar 아카이브 파일을 준비했음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(혹시 다운로드하고 싶은 분들을 위해 상단에 링크 남겨놓음)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ME6EG/btslxKJAdhU/Z4aFiM7Z19VHcaKIdxRCC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ME6EG/btslxKJAdhU/Z4aFiM7Z19VHcaKIdxRCC0/img.png&quot; data-alt=&quot;/home/app 경로의 open jdk 1.8 tar 아카이브 파일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ME6EG/btslxKJAdhU/Z4aFiM7Z19VHcaKIdxRCC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FME6EG%2FbtslxKJAdhU%2FZ4aFiM7Z19VHcaKIdxRCC0%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;818&quot; height=&quot;234&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;234&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;/home/app 경로의 open jdk 1.8 tar 아카이브 파일&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cd /&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mkdir was&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mkdir was/jdk1.8&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jdk1.8 폴더에 OpenJDK 1.8을 풀어줌.&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: #fcfcfc; color: #666666; text-align: left;&quot;&gt; 아카이브 해제 명령어&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;tar zxf&lt;span&gt;&amp;nbsp;&lt;/span&gt;/home/app/OpenJDK8U-jdk_x64_linux_8u342b07.tar.gz -C /was/jdk1.8 --strip-components 1&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;컨테이너 실행 옵션 설명&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;#&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #666666;&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; zxf /경로&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&amp;nbsp;: 대상 tar 아카이브 지정해서 파일 추출&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;#&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #666666;&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;span&gt; -C&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt; :&amp;nbsp; 아카이브 파일을 풀 위치 지정&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;#&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #666666;&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;--strip-components [number]&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:&amp;nbsp; number 단계만큼 파일 경로를 제외하고 tar 아카이브 해제하기 명령어&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하면 /was/jdk1.8 폴더에 OpenJDK1.8 설치완료.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;3. 환경변수 설정&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경변수를 설정하기 위해서는 /etc/profile 파일을 수정해야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vi 편집기를 사용하여 수정 진행함.(vi or vim 편집기가 없으면 설치진행)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vi /etc/profile : 편집기로 profile 파일 수정&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;#추가구문&lt;br /&gt;export JAVA_HOME=/was/jdk1.8&lt;br /&gt;export PATH=$JAVA_HOME/bin:$PATH&lt;br /&gt;export CLASSPATH=$CLASSPATH:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 명령어를 맨 밑에 추가 후 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 source /etc/profile 명령어를 사용해 적용시키면 끝!!&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;아무 경로에서 java -version / javac 명령어를 쳤을 때 이런 식으로 나온다면 합격 &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lzclG/btsluWcUko4/6oRkhbBFXf6HIEd7Tkp160/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lzclG/btsluWcUko4/6oRkhbBFXf6HIEd7Tkp160/img.png&quot; data-alt=&quot;java -version / javac 명령어 입력 시 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lzclG/btsluWcUko4/6oRkhbBFXf6HIEd7Tkp160/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlzclG%2FbtsluWcUko4%2F6oRkhbBFXf6HIEd7Tkp160%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;600&quot; height=&quot;419&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;java -version / javac 명령어 입력 시 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 글에선 Was 서버에 톰켓을 설치하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고양이가 나오는 index.jsp 화면을 띄우는 걸 진행해 보겠음!! &lt;/p&gt;</description>
      <category>개발자 모드/개념</category>
      <category>Docker</category>
      <category>was서버</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/34</guid>
      <comments>https://precious-value.tistory.com/34#entry34comment</comments>
      <pubDate>Tue, 27 Jun 2023 16:48:33 +0900</pubDate>
    </item>
    <item>
      <title>[Tomcat] 톰켓 구동 시 profile 설정하기</title>
      <link>https://precious-value.tistory.com/33</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;개발 초기 단계에서는 profile 설정을 따로 안 하겠지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 환경과 배포 환경이 달라 profile 설정을 해야 할 때!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IntellJ에서는 Spring이라면 메이븐 톰켓 or Spring Boot라면 내장톰켓이 있기에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;톰켓에 구동 시 profile을 명시하는 명령어를 입력해주어야 하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배포 환경(툴을 쓰지 않는 환경)에서는 Tomcat 쪽에 설정을 해주어야 함.&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;먼저, IntellJ를 사용할 때 설정 방법 알려드리겠음!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;b&gt;1. IntellJ에서&amp;nbsp; 설정&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정방법은 IntellJ를 실행한 다음, 우측 상단에 보시면 이미지와 같은 탭이 있음! 클릭 &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;34&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5qnB5/btsk60fwsqo/TCDz1MjwgcRGOSm8fXKFI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5qnB5/btsk60fwsqo/TCDz1MjwgcRGOSm8fXKFI1/img.png&quot; data-alt=&quot;설정 방법 이미지1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5qnB5/btsk60fwsqo/TCDz1MjwgcRGOSm8fXKFI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5qnB5%2Fbtsk60fwsqo%2FTCDz1MjwgcRGOSm8fXKFI1%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; alt=&quot;설정 방법 이미지1&quot; loading=&quot;lazy&quot; width=&quot;384&quot; height=&quot;26&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;34&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;설정 방법 이미지1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 Edit configurations... 를 클릭 &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;813&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sfgga/btsk7GOExGl/Ztf2XkTyTpphERUlAhABmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sfgga/btsk7GOExGl/Ztf2XkTyTpphERUlAhABmk/img.png&quot; data-alt=&quot;설정 방법 이미지2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sfgga/btsk7GOExGl/Ztf2XkTyTpphERUlAhABmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsfgga%2Fbtsk7GOExGl%2FZtf2XkTyTpphERUlAhABmk%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; alt=&quot;설정 방법 이미지2&quot; loading=&quot;lazy&quot; width=&quot;596&quot; height=&quot;386&quot; data-origin-width=&quot;813&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;설정 방법 이미지2&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;이런 창이 뜨는데 이 창에서 Modify options &amp;gt; Add VM options를 클릭 (단축키는 Alt+V)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하면 Java Options라는 탭이 추가가 되는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하단 VM options에 &lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-darkreader-inline-bgcolor=&quot;&quot; data-darkreader-inline-color=&quot;&quot;&gt;-Dspring.profiles.active=dev(기호에 맞게 수정) 명령어 입력 후 저장하면 끝!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot; data-darkreader-inline-color=&quot;&quot;&gt;2. Tomcat에 설정&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;톰켓에 설정하는 방법도 IntellJ 못지않게 쉬운 편인데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법은 여러 가지지만 필자가 한 방법을 소개해줌!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 Tomcat 폴더로 이동 &amp;zwj;♀️&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;(linux OS 기준으로 설명하겠음 / window는 그냥 파일 생성해서 메모장으로 수정하면 됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;- cd tomcat 경로/bin : bin 폴더로 이동&lt;br /&gt;- vi setenv.sh : tomcat/bin 경로에 setenv.sh라는 파일을 생성!&lt;br /&gt;- export JAVA_OPTS=&quot;$JAVA_OPTS -Dspring.profiles.active=&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot; data-darkreader-inline-color=&quot;&quot;&gt;dev&lt;/span&gt;&lt;/b&gt;&quot; &amp;nbsp;명령어 입력!&amp;nbsp;&lt;br /&gt;여기도 동일하게 &lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot; data-darkreader-inline-color=&quot;&quot;&gt;dev&lt;/span&gt;&lt;/b&gt; 말고 독자님들이 원하는 profile Name을 넣으시면 됨!&lt;br /&gt;- :wq : 저장 후 종료&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 톰켓을 다시 실행시키면 profile이 설정된 상태로 톰켓이 구동이 됨! 끝 &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;/p&gt;</description>
      <category>개발자 모드/개념</category>
      <category>profile 설정</category>
      <category>Tomcat</category>
      <category>Tomcat profile</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/33</guid>
      <comments>https://precious-value.tistory.com/33#entry33comment</comments>
      <pubDate>Fri, 23 Jun 2023 16:29:38 +0900</pubDate>
    </item>
    <item>
      <title>[CentOs] shell(.sh) 파일 만들기</title>
      <link>https://precious-value.tistory.com/32</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt; 서론(바쁘시면 본론부터)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 컨테이너를 띄워 WAS 서버를 세팅하고자 함!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;centos7 버전의 컨테이너를 띄우고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tomcat 3개를 만들어서 포트 설정까지 완료했음.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 톰켓서버 3개 한 번에 꺼지거나 구동시킬 수 있는 shell 파일을 만들고자 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;543&quot; data-origin-height=&quot;99&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQyI0v/btskiTA1Ag0/F9OUMsU1F4VEXQbkTaPzv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQyI0v/btskiTA1Ag0/F9OUMsU1F4VEXQbkTaPzv1/img.png&quot; data-alt=&quot;필자의 /was 디렉토리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQyI0v/btskiTA1Ag0/F9OUMsU1F4VEXQbkTaPzv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQyI0v%2FbtskiTA1Ag0%2FF9OUMsU1F4VEXQbkTaPzv1%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;543&quot; height=&quot;99&quot; data-origin-width=&quot;543&quot; data-origin-height=&quot;99&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;필자의 /was 디렉토리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 /was 디렉토리 안에 위와 같이 구성했음.&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;- tomcat9-~ : 각각의 톰켓서버 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- startup_all.sh : 톰켓 서버를 한 번에 구동시키는&amp;nbsp; sh 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- shutdown_all.sh : 톰켓 서버를 한 번에 종료시키는 sh 파일&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;startup_all.sh 파일 추가/수정(vi startup_all.sh 명령어 사용하여 수정)&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;#!/bin/bash &lt;br /&gt;echo &quot;server start&quot;&lt;br /&gt;&lt;br /&gt;/was/tomcat9-ui/bin/startup.sh&lt;br /&gt;/was/tomcat9-ai/bin/startup.sh&lt;br /&gt;/was/tomcat9-api/bin/startup.sh&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#!/bin/bash : bash로 쉘 스크립트를 작성하겠음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;echo &quot;&quot; : &quot;&quot; 안의 문자열 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/was/tomcat9-*/bin/startup.sh : 톰켓 서버 구동 shell 파일 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/was/tomcat9-*/bin/shutdown.sh : 톰켓 서버 종료 shell 파일 실행&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;이런 식으로 startup_all.sh, shutdown_all.sh 쉘 스크립트 파일을 간단하게 만들었음!!&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;./startup_all.sh or sh startup_all.sh를 사용하면 실행할 수 있음.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-bgNkRlaixC7lEMjU&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;859&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oqJAd/btskyQCVDbe/bZR0JEATdGTHS5ujfPJsH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oqJAd/btskyQCVDbe/bZR0JEATdGTHS5ujfPJsH0/img.png&quot; data-alt=&quot;startup_all.sh 파일 실행 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oqJAd/btskyQCVDbe/bZR0JEATdGTHS5ujfPJsH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoqJAd%2FbtskyQCVDbe%2FbZR0JEATdGTHS5ujfPJsH0%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;859&quot; height=&quot;440&quot; data-origin-width=&quot;859&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;startup_all.sh 파일 실행 결과&lt;/figcaption&gt;
&lt;/figure&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;이젠 파일하나만 실행하면 3개의 톰켓 서버를 껐다 켤 수 있게 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알면 shell 스크립트를 몰랐다면 엄청 귀찮을 뻔했음.&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; 참조사이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://deeplify.dev/server/bash/create-execute-file-in-linux&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://deeplify.dev/server/bash/create-execute-file-in-linux&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1687142617447&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Linux/리눅스] Shell 실행 파일 만드는 방법 및 예제&quot; data-og-description=&quot;리눅스 환경에서 Shell 스크립트로 실행파일을 만드는 방법을 예제를 통해 소개합니다.&quot; data-og-host=&quot;deeplify.dev&quot; data-og-source-url=&quot;https://deeplify.dev/server/bash/create-execute-file-in-linux&quot; data-og-url=&quot;https://deeplify.dev/server/bash/create-execute-file-in-linux&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bvFSF6/hyS2zOwoLW/6C34Uh2cLfUcYlE9HVOrPK/img.png?width=400&amp;amp;height=300&amp;amp;face=0_0_400_300,https://scrap.kakaocdn.net/dn/ic5A3/hyS2C5wEjb/n4PUrC4avKCN9E5qCRNMUk/img.png?width=400&amp;amp;height=300&amp;amp;face=0_0_400_300&quot;&gt;&lt;a href=&quot;https://deeplify.dev/server/bash/create-execute-file-in-linux&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://deeplify.dev/server/bash/create-execute-file-in-linux&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bvFSF6/hyS2zOwoLW/6C34Uh2cLfUcYlE9HVOrPK/img.png?width=400&amp;amp;height=300&amp;amp;face=0_0_400_300,https://scrap.kakaocdn.net/dn/ic5A3/hyS2C5wEjb/n4PUrC4avKCN9E5qCRNMUk/img.png?width=400&amp;amp;height=300&amp;amp;face=0_0_400_300');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Linux/리눅스] Shell 실행 파일 만드는 방법 및 예제&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;리눅스 환경에서 Shell 스크립트로 실행파일을 만드는 방법을 예제를 통해 소개합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;deeplify.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 모드/개념</category>
      <category>sh</category>
      <category>sh 만들기</category>
      <category>Shell</category>
      <category>shell 스크립트</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/32</guid>
      <comments>https://precious-value.tistory.com/32#entry32comment</comments>
      <pubDate>Mon, 19 Jun 2023 11:46:36 +0900</pubDate>
    </item>
    <item>
      <title>[Bat]간단한 배치 파일 만들기</title>
      <link>https://precious-value.tistory.com/31</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;회사에서 선임이 알려준 대로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker compose를 사용하는데 배치파일을 작성해&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;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;Awesome 한&lt;/b&gt;&lt;/span&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;blockquote data-ke-style=&quot;style3&quot;&gt; &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;배치파일&lt;/b&gt;&lt;/span&gt;이란??&lt;br /&gt;&lt;span style=&quot;color: #953b34;&quot;&gt;- Windows 운영 체제에서 사용되는 스크립트 파일로 일련의 명령어를 포함하며, 일련의 작업을 자동화하거나 여러 명령어를 한꺼번에 실행하는 데 사용됨&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #953b34;&quot;&gt;- 일반적으로 &quot;.bat&quot; or &quot;.cmd&quot; 확장자를 가지며, 텍스트 파일 형식으로 작성됨&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #953b34;&quot;&gt;- 배치 파일은 보통 자주 반복되는 작업을 자동화하는 데 사용하며, 특정 작업을 주기적으로 실행해야 하는 경우 배치파일을 작성해 작업을 예약할 수 있고, 여러 명령어를 한 배치 파일에 작성해 명령어를 한꺼번에 실행하도록 할 수 있음&lt;/span&gt;&lt;/blockquote&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배치파일 생성은 메모장이나 다른 편집기를 써도 상관없음!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 intellij를 실행시키는 배치파일을 만들어 봤음.&lt;/p&gt;
&lt;pre id=&quot;code_1686287064018&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@echo off
cd /d %~dp0	
rem 주석!

set Program=idea64.exe

echo.
echo.
echo Hello!! I'm IntelliJ starter. Nice to meet you.
echo.
echo.
start /d &quot;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2022.3.1\bin\&quot; /b %Program%&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. @echo off : 명령어를 출력하지 않겠다는 건데 모르겠으면 @echo on을 해보면 바로 이해함 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. cd /d %~dp0 : 스크립트가&amp;nbsp;저장되어&amp;nbsp;있는&amp;nbsp;장소를&amp;nbsp;현재&amp;nbsp;디렉터리로&amp;nbsp;하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. rem : 주석 명령어&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. set : 변수 선언 / 사용 시 %NAME% 처럼 %%안에 변수명 넣으면 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. echo. : 빈 줄 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. ehco : 문자열 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. start /d &quot;경로&quot; /b &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;/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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C:\ProgramData\Microsoft\Windows\Start&amp;nbsp;Menu\Programs\StartUp&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경로에 파일을 두면 컴퓨터 부팅 시 실행이 됨. 시작프로그램인 셈.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경로에서 Start Menu 나 StartUp이 한글로 되어있어도 당황하지 않기 &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6qk8X/btsjcU20eGj/Q7M3S5FFtNtsf0rctTDcj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6qk8X/btsjcU20eGj/Q7M3S5FFtNtsf0rctTDcj1/img.png&quot; data-alt=&quot;배치 파일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6qk8X/btsjcU20eGj/Q7M3S5FFtNtsf0rctTDcj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6qk8X%2FbtsjcU20eGj%2FQ7M3S5FFtNtsf0rctTDcj1%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;931&quot; height=&quot;175&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;175&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;필자처럼 배치 파일을 조심스럽게 위 경로에 두고 재부팅을 하면....&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다들 안녕 &lt;/p&gt;</description>
      <category>개발자 모드/개념</category>
      <category>Bat</category>
      <category>bat file</category>
      <category>배치파일</category>
      <category>윈도우 시작프로그램</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/31</guid>
      <comments>https://precious-value.tistory.com/31#entry31comment</comments>
      <pubDate>Fri, 9 Jun 2023 14:43:38 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot / React 프로젝트] classPath 설정 방법</title>
      <link>https://precious-value.tistory.com/30</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 Spring Boot + React + Gradle 프로젝트를 진행하게 되었음.&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;React 정적 파일들 설정을 어떻게 해야 하는지 몰라서 찾아보며 정리함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;※ Spring Boot + React 프로젝트 정적 파일 관련 설정 방법&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;React와 Spring Boot를 함께 사용하는 경우, React에서 빌드된 정적 파일들을 Spring Boot 애플리케이션과 함께 배포할 때, 일반적으로 Spring Boot의 정적 파일(Static files) 디렉토리에 위치시키는 것이 일반적입니다.&lt;br /&gt;&lt;br /&gt;보통 React 프로젝트는&amp;nbsp;빌드를 진행하면, build 디렉토리에 빌드된 정적 파일들이 생성됩니다. 이후 Spring Boot 프로젝트의 정적 파일 디렉토리(src/main/resources/static)에 빌드된 파일들을 복사하면 됩니다.&lt;br /&gt;&lt;br /&gt;예를 들어, React 애플리케이션을 빌드한 후 생성된 build 디렉토리에서 index.html과 static 폴더를 모두src/main/resources/static 디렉토리로 복사합니다. 그러면 Spring Boot가 실행될 때, 해당 파일들은 클래스패스(classpath)에 포함되어, 정적 파일 리소스로 사용될 수 있습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, react 프로젝트를 빌드하고 나서 Spring Boot의 ClassPath 경로인 /static, /public, /resources 등 디렉토리에 위치시키면&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;react&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;필자는 다른 사이트를 참고하여 아래와 같이 gradle 설정을 함.&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_1684131739071&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def reactAppDir = &quot;$projectDir/app&quot;	//리액트경로

sourceSets {
	main {
		resources {
			srcDirs = [&quot;$webAppDir/build&quot;, &quot;$projectDir/src/main/resources&quot;]
		}
	}
}

processResources {
	dependsOn &quot;copyReactFile&quot;
}

task copyReactFile(type: Copy){	
//build 된 React 정적파일을 Spring Boot 정적파일 디렉토리로 이동
	dependsOn &quot;buildReact&quot;
	from &quot;$reactAppDir/build&quot;
	into &quot;$projectDir/src/main/resources/static&quot;
}

task buildReact(type: Exec){	
//React build 
    dependsOn &quot;installReact&quot;
    workingDir &quot;$reactAppDir&quot;
    inputs.dir &quot;$reactAppDir&quot;
    group = BasePlugin.BUILD_GROUP
    if(System.getProperty('os.name').toLowerCase(Locale.ROOT).contains('windows')){
        commandLine &quot;npm.cmd&quot;,&quot;run-script&quot;,&quot;build&quot;
    }else{
        commandLine &quot;npm&quot;,&quot;run-script&quot;,&quot;build&quot;
    }
}

task installReact(type: Exec){	
//프로젝트에 필요한 라이브러리 install
	dependsOn &quot;deleteReactFile&quot;
	workingDir &quot;$reactAppDir&quot;
	inputs.dir &quot;$reactAppDir&quot;
	group = BasePlugin.BUILD_GROUP
	if(System.getProperty('os.name').toLowerCase(Locale.ROOT).contains('windows')){
		commandLine &quot;npm.cmd&quot;,&quot;audit&quot;,&quot;fix&quot;
		commandLine &quot;npm.cmd&quot;,&quot;install&quot;
	}else{
		commandLine &quot;npm&quot;,&quot;audit&quot;,&quot;fix&quot;
		commandLine &quot;npm&quot;,&quot;install&quot;
	}
}

task deleteReactFile(type: Delete){	
//static 폴더 삭제
	delete &quot;$projectDir/src/main/resources/static&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;필자는 build된 React 이전 파일들이 있을 수 있으니까 static 경로의 파일들을 삭제하고 시작했음.&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;gradle 설정은 이렇게 완료하고 프로젝트 경로에서 ./gradlew build 명령어를 사용해 빌드를 하면&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;/src/main/resources/static 위치에 빌드된 react 정적 파일들이 복사가 됨.&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;마찬가지로 배포할때도 war 폴더를 보면 classes/static 경로에 react 정적 파일들이 위치한 것을 볼 수 있음. 끝. &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>개발자 모드/응용</category>
      <category>build</category>
      <category>classpath</category>
      <category>gradle</category>
      <category>REACT</category>
      <category>Spring Boot</category>
      <category>정적파일</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/30</guid>
      <comments>https://precious-value.tistory.com/30#entry30comment</comments>
      <pubDate>Mon, 15 May 2023 15:36:30 +0900</pubDate>
    </item>
    <item>
      <title>[Git] Spring Boot + React 프로젝트 git에 add 안될 때</title>
      <link>https://precious-value.tistory.com/29</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Boot + React 프로젝트를 진행하는데 초기 세팅을 끝내서 GitLab(필자의 원격저장소)에 push 진행.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUaoJ2/btsdTa2mro6/cljDBQjnszUBTu6ZZu9GjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUaoJ2/btsdTa2mro6/cljDBQjnszUBTu6ZZu9GjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUaoJ2/btsdTa2mro6/cljDBQjnszUBTu6ZZu9GjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUaoJ2%2FbtsdTa2mro6%2FcljDBQjnszUBTu6ZZu9GjK%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; alt=&quot;필자의 프로젝트 구조&quot; loading=&quot;lazy&quot; width=&quot;230&quot; height=&quot;518&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;518&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. react 파일 경로인 /app 경로의 파일만 git에 add가 안됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시 몰라서 .gitignore 파일에 찾아봐도 해당사항 없음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애초에 .gitignore 파일에 있으면 아예 제외되야 하는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git status를 치면 /app 경로를 관리는 하고 있음.&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. submodule을 추가하라는 git 관련 hint 메세지가 나옴.&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;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이유를 몰라서 갓글에 검색해 보니 하위 폴더인 app 경로 안에 .git 파일이 있어서 문제가 됐던 것!&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;blockquote data-ke-style=&quot;style3&quot;&gt; &lt;span style=&quot;color: #f89009;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;b&gt;해결방법&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #ef6f53;&quot; data-darkreader-inline-color=&quot;&quot;&gt;1. 하위 폴더안에 .git 폴더 삭제처리&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #953b34;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&amp;nbsp;- 필자의 경우를 예시로 들면 /app 경로 안에 .git 폴더를 삭제함.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #ef6f53;&quot; data-darkreader-inline-color=&quot;&quot;&gt;2. 이전에 commit 이력이 있다면 스테이징 영역 파일 제거해야 함.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #953b34;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&amp;nbsp;- 터미널에 git rm --cached . -rf 명령어를 치면 제거할 수 있음.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #ef6f53;&quot; data-darkreader-inline-color=&quot;&quot;&gt;3. 다시 git add / commit / push 순서대로 진행하면 해결!&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&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;/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;a href=&quot;https://velog.io/@ohhyunji/Github-%ED%99%94%EC%82%B4%ED%91%9C-%ED%8F%B4%EB%8D%94push%ED%96%88%EB%8A%94%EB%8D%B0-%ED%8C%8C%EC%9D%BC-%EC%95%88%EC%97%90-%EB%82%B4%EC%9A%A9%EC%9D%B4-%EC%95%88%EC%98%AC%EB%9D%BC%EA%B0%88%EB%95%8C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@ohhyunji/Github-%ED%99%94%EC%82%B4%ED%91%9C-%ED%8F%B4%EB%8D%94push%ED%96%88%EB%8A%94%EB%8D%B0-%ED%8C%8C%EC%9D%BC-%EC%95%88%EC%97%90-%EB%82%B4%EC%9A%A9%EC%9D%B4-%EC%95%88%EC%98%AC%EB%9D%BC%EA%B0%88%EB%95%8C&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1683162766431&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Github] 화살표 폴더(push했는데 파일 안에 내용이 안올라갈때)&quot; data-og-description=&quot;github에서 화살표 폴더 해결하는 방법&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@ohhyunji/Github-%ED%99%94%EC%82%B4%ED%91%9C-%ED%8F%B4%EB%8D%94push%ED%96%88%EB%8A%94%EB%8D%B0-%ED%8C%8C%EC%9D%BC-%EC%95%88%EC%97%90-%EB%82%B4%EC%9A%A9%EC%9D%B4-%EC%95%88%EC%98%AC%EB%9D%BC%EA%B0%88%EB%95%8C&quot; data-og-url=&quot;https://velog.io/@ohhyunji/Github-화살표-폴더push했는데-파일-안에-내용이-안올라갈때&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/s2hzz/hyStLpDSkn/V6akld8tN3ZcujTYBlef4K/img.png?width=417&amp;amp;height=174&amp;amp;face=0_0_417_174,https://scrap.kakaocdn.net/dn/b52iCy/hyStUz5290/62ZNQUVjZ05LlqyPu0e0X1/img.png?width=417&amp;amp;height=174&amp;amp;face=0_0_417_174,https://scrap.kakaocdn.net/dn/b0XR2n/hySvveoqZ1/V5pnUukgQAPSU2WVlBT8hk/img.png?width=392&amp;amp;height=569&amp;amp;face=0_0_392_569&quot;&gt;&lt;a href=&quot;https://velog.io/@ohhyunji/Github-%ED%99%94%EC%82%B4%ED%91%9C-%ED%8F%B4%EB%8D%94push%ED%96%88%EB%8A%94%EB%8D%B0-%ED%8C%8C%EC%9D%BC-%EC%95%88%EC%97%90-%EB%82%B4%EC%9A%A9%EC%9D%B4-%EC%95%88%EC%98%AC%EB%9D%BC%EA%B0%88%EB%95%8C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@ohhyunji/Github-%ED%99%94%EC%82%B4%ED%91%9C-%ED%8F%B4%EB%8D%94push%ED%96%88%EB%8A%94%EB%8D%B0-%ED%8C%8C%EC%9D%BC-%EC%95%88%EC%97%90-%EB%82%B4%EC%9A%A9%EC%9D%B4-%EC%95%88%EC%98%AC%EB%9D%BC%EA%B0%88%EB%95%8C&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/s2hzz/hyStLpDSkn/V6akld8tN3ZcujTYBlef4K/img.png?width=417&amp;amp;height=174&amp;amp;face=0_0_417_174,https://scrap.kakaocdn.net/dn/b52iCy/hyStUz5290/62ZNQUVjZ05LlqyPu0e0X1/img.png?width=417&amp;amp;height=174&amp;amp;face=0_0_417_174,https://scrap.kakaocdn.net/dn/b0XR2n/hySvveoqZ1/V5pnUukgQAPSU2WVlBT8hk/img.png?width=392&amp;amp;height=569&amp;amp;face=0_0_392_569');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Github] 화살표 폴더(push했는데 파일 안에 내용이 안올라갈때)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;github에서 화살표 폴더 해결하는 방법&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>개발자 모드/오류처리</category>
      <category>error</category>
      <category>git</category>
      <category>git add 안됨</category>
      <category>REACT</category>
      <category>SpringBoot</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/29</guid>
      <comments>https://precious-value.tistory.com/29#entry29comment</comments>
      <pubDate>Thu, 4 May 2023 10:32:43 +0900</pubDate>
    </item>
    <item>
      <title>초보자를 위한 쿠키와 세션 이해하기</title>
      <link>https://precious-value.tistory.com/28</link>
      <description>&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;amp; 머리에 주입시켜볼려고 함.&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignLeft&quot; data-emoticon-type=&quot;face&quot; data-emoticon-name=&quot;057&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/face/large/057.png&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/face/large/057.png&quot; width=&quot;80&quot; /&gt;&lt;/figure&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: #fcfcfc; color: #666666; text-align: left;&quot;&gt;쿠키(Cookie)와 세션(Session)은 모두 웹 어플리케이션에서 사용되는 데이터 저장 방식임.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;1. 쿠키(Cookie)란?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 사용자의 로그인 정보나 기타 정보를 브라우저에 저장하는 작은 데이터 파일&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 브라우저의 쿠키 스토리지에 저장되는 key-value 쌍으로, 서버로 전송되어 처리됨.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 사용자의 개인 정보를 저장하기 때문에, 보완적인 측면에서 주의해야함(민감한 정보 저장은 피하고 쿠키를 암호화해서 처리하는게 좋음)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 쿠키는 만료일이 지나면 자동으로 삭제가 되고, 만료일을 설정하지 않으면 브라우저가 종료될 때까지 쿠키가 유지됨.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 웹 개발에서 매우 활용도가 높은데, 사용자의 로그인 정보나 사용자 설정 등을 저장하여, 사용자 경험을 향상시키고 개발 효율을 높일 수 있음.&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&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;상품 선택 후 결제를 진행한다고 가정해봄.&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;/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;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;2. 세션(Session)이란?&lt;br /&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #333333; text-align: left;&quot;&gt;- 세션은 쿠키와 달리 서버에서 관리하는데, 사용자가 웹 사이트에 접속하면 서버는 사용자에게 고유한 세션ID를 부여함.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 서버는 세션 ID를 이용하여 사용자의 정보를 관리함. 사용자가 로그인하면, 서버는 사용자의 로그인 정보를 세션에 저장하고, 다른 페이지에서도 사용할 수 있도록 함.&lt;br /&gt;- 세션은 일정 시간동안 유지되며, 사용자가 로그아웃하거나 브라우저를 종료하면 자동으로 삭제됨. 세션의 유효 시간은 서버에서 설정할 수 있음.&lt;br /&gt;- 쿠키와 달리 사용자의 브라우저에 저장되지 않으므로, 보안성이 더 높고 사용자의 개인 정보가 서버에 저장되기 때문에, 정보 유출의 위험이 낮아짐.&lt;br /&gt;- 서버에서 세션을 관리하기 때문에, 사용자의 브라우저에 저장되는 쿠키보다 더 많은 자원을 소비함. 따라서, 세션을 사용할 때는 서버의 자원 관리에 유의해야 함.&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&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;자원의 소비량, 보안성 등이 달라지기 때문에(주관적 판단임 )&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;최근에는 쿠키와 세션 말고도 다양한 인증 방식이 있는데, OAuth2.0이나 JWT(JSON Web Tokens) 등이 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 인증 방식들은 쿠키와 세션의 보안적인 취약점을 보완하고, 웹 개발에서 보다 안전하고 효율적인 인증 방식을 제공함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자도 JWT를 사용하여 인증 방식을 구현한 경험이 있음.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;But, JWT도 세션이나 쿠키처럼 취약점은 존재함.&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;/p&gt;</description>
      <category>개발자 모드/개념</category>
      <category>cookie</category>
      <category>JWT</category>
      <category>session</category>
      <category>세션</category>
      <category>쿠키</category>
      <author>까짓거 해보자 개발자</author>
      <guid isPermaLink="true">https://precious-value.tistory.com/28</guid>
      <comments>https://precious-value.tistory.com/28#entry28comment</comments>
      <pubDate>Tue, 11 Apr 2023 16:59:25 +0900</pubDate>
    </item>
  </channel>
</rss>