<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>프로그래밍 연습하기</title>
    <link>https://studyprogram.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 18 May 2026 06:18:20 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>john.k</managingEditor>
    <item>
      <title>Pycharm Database Tool에서 WSL에 있는 SQLite 파일을 사용할 수 없는 문제</title>
      <link>https://studyprogram.tistory.com/entry/Pycharm-Database-Tool%EC%97%90%EC%84%9C-WSL%EC%97%90-%EC%9E%88%EB%8A%94-SQLite-%ED%8C%8C%EC%9D%BC%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%A0-%EC%88%98-%EC%97%86%EB%8A%94-%EB%AC%B8%EC%A0%9C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Pycharm을 사용해서 WSL에서 SQLite를 사용하려는데 문제가 생겼습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pycharm에 내장되어있는 Database Tool을 사용해서 연결을 하려는데 다음과 같은 에러가 발생했습니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1694676531021&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Error encountered when performing Introspect schema main: 
[SQLITE_BUSY] The database file is locked (database is locked). 
[SQLITE_BUSY] The database file is locked (database is locked)&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;찾아보니 WSL 환경에서 SQLite 파일을 연결할 때 발생하는 문제로 보입니다.&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;임시 해결책은 사용하려는 SQLite 파일을 윈도우에 두고 Database Tool으로 그 파일에 연결하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WSL에서는 원본 파일의 심볼릭 링크를 만들어서 사용합니다.&lt;/p&gt;</description>
      <category>IDE</category>
      <category>pycharm</category>
      <category>sqlite</category>
      <category>WSL</category>
      <author>john.k</author>
      <guid isPermaLink="true">https://studyprogram.tistory.com/293</guid>
      <comments>https://studyprogram.tistory.com/entry/Pycharm-Database-Tool%EC%97%90%EC%84%9C-WSL%EC%97%90-%EC%9E%88%EB%8A%94-SQLite-%ED%8C%8C%EC%9D%BC%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%A0-%EC%88%98-%EC%97%86%EB%8A%94-%EB%AC%B8%EC%A0%9C#entry293comment</comments>
      <pubDate>Thu, 14 Sep 2023 16:33:10 +0900</pubDate>
    </item>
    <item>
      <title>Youtube 재생목록(Playlist)안의 동영상 ID 얻기</title>
      <link>https://studyprogram.tistory.com/entry/Youtube-%EC%9E%AC%EC%83%9D%EB%AA%A9%EB%A1%9DPlaylist%EC%95%88%EC%9D%98-%EB%8F%99%EC%98%81%EC%83%81-ID-%EC%96%BB%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Youtube 재생목록에 어떤 동영상들이 있는지 가져오려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 파이썬의 패키지인 Youtube-dl을 사용해야하나 싶었는데&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;그런데 먼저 준비해야될 것은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Google Cloud Console(&lt;a href=&quot;https://console.cloud.google.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://console.cloud.google.com/&lt;/a&gt;) 에서 프로젝트를 생성 후&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 및 서비스 -&amp;gt; 라이브러리에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;YouTube Data API v3 을 사용 설정하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API Key를 만들어서 그 키로 API를 사용해야 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1694513866072&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def get_playlist_items(playlist_id = None):
    playlist_id = &quot;유튜브 재생목록 ID&quot;
    api_key = os.getenv(&quot;YOUTUBE_API_KEY&quot;) # 발급받은 API KEY 입력
    next_page_token = True
    result = []
    while next_page_token:
        request_url = &quot;https://youtube.googleapis.com/youtube/v3/playlistItems?&quot;\
                      f&quot;part=snippet&amp;amp;playlistId={playlist_id}&amp;amp;key={api_key}&amp;amp;maxResults=50&quot;
        if next_page_token is not True:
            request_url += f&quot;&amp;amp;pageToken={next_page_token}&quot;
        res = requests.get(request_url)
        res_json = res.json()
        res_items = res_json.get(&quot;items&quot;)
        if res_items:
            for _item in res_items:
                snippet = _item[&quot;snippet&quot;]
                resource_id = snippet[&quot;resourceId&quot;][&quot;videoId&quot;]
                title = snippet[&quot;title&quot;]
                item_dict = dict(title=title, resource_id=resource_id)
                result.append(item_dict)
        next_page_token = res_json.get(&quot;nextPageToken&quot;)
        # next_page_token = None # 한번만 하려면 위의 라인 대신 이 라인 사용

    pprint.pprint(result)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 간단한 코드를 통해서 사용했는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 API는 한번에 불러올 수 있는 개수가 최대 50개까지라서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복문을 통해 nextPageToken으로 계속 다음 목록을 요청해서&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;저는 일단 동영상의 id만 필요해서 title과 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;&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;&lt;a href=&quot;https://developers.google.com/youtube/v3/docs/playlistItems/list?hl=ko&quot;&gt;https://developers.google.com/youtube/v3/docs/playlistItems/list?hl=ko&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1694514023243&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;PlaylistItems: list &amp;nbsp;|&amp;nbsp; YouTube Data API &amp;nbsp;|&amp;nbsp; Google for Developers&quot; data-og-description=&quot;이 페이지는 Cloud Translation API를 통해 번역되었습니다. Switch to English PlaylistItems: list 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. API 요청 매개변수와 일치&quot; data-og-host=&quot;developers.google.com&quot; data-og-source-url=&quot;https://developers.google.com/youtube/v3/docs/playlistItems/list?hl=ko&quot; data-og-url=&quot;https://developers.google.com/youtube/v3/docs/playlistItems/list?hl=ko&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://developers.google.com/youtube/v3/docs/playlistItems/list?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developers.google.com/youtube/v3/docs/playlistItems/list?hl=ko&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;PlaylistItems: list &amp;nbsp;|&amp;nbsp; YouTube Data API &amp;nbsp;|&amp;nbsp; Google for Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지는 Cloud Translation API를 통해 번역되었습니다. Switch to English PlaylistItems: list 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. API 요청 매개변수와 일치&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developers.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;</description>
      <category>Python</category>
      <category>YouTube</category>
      <category>YoutubeAPI</category>
      <category>유튜브</category>
      <category>유튜브API</category>
      <category>유튜브재생목록</category>
      <author>john.k</author>
      <guid isPermaLink="true">https://studyprogram.tistory.com/292</guid>
      <comments>https://studyprogram.tistory.com/entry/Youtube-%EC%9E%AC%EC%83%9D%EB%AA%A9%EB%A1%9DPlaylist%EC%95%88%EC%9D%98-%EB%8F%99%EC%98%81%EC%83%81-ID-%EC%96%BB%EA%B8%B0#entry292comment</comments>
      <pubDate>Tue, 12 Sep 2023 19:50:26 +0900</pubDate>
    </item>
    <item>
      <title>Python Selenium Firefox 사용 시 Message: binary is not a Firefox executable 에러</title>
      <link>https://studyprogram.tistory.com/entry/Python-Selenium-Firefox-%EC%82%AC%EC%9A%A9-%EC%8B%9C-Message-binary-is-not-a-Firefox-executable-%EC%97%90%EB%9F%AC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;WSL로 파이썬 셀레니움을 사용하려던 중 다음과 같은 에러를 봤습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;selenium.common.exceptions.InvalidArgumentException:&amp;nbsp;Message:&amp;nbsp;binary&amp;nbsp;is&amp;nbsp;not&amp;nbsp;a&amp;nbsp;Firefox&amp;nbsp;executable&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;pre id=&quot;code_1692421554995&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;options = Options()
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

geckodriver_path = &quot;/snap/bin/geckodriver&quot;  # specify the path to your geckodriver
driver_service = Service(executable_path=geckodriver_path)

self.driver = webdriver.Firefox(options=options, service=driver_service)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 옵션에 argument를 추가해주니 정상적으로 작동했습니다.&lt;/p&gt;
&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://stackoverflow.com/questions/76846675/selenium-ubuntu22-bug-message-binary-is-not-a-firefox-executable&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/76846675/selenium-ubuntu22-bug-message-binary-is-not-a-firefox-executable&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1692421523927&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;Selenium/Ubuntu22 bug &amp;quot;Message: binary is not a Firefox executable&amp;quot;&quot; data-og-description=&quot;Curious, does anyone here know how I might fix this Selenium/Ubuntu22 bug? Got a Python3 script that still runs fine on Debian 12, but I'm trying to use it on Ubuntu22 with firefox and geckodriver ...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/76846675/selenium-ubuntu22-bug-message-binary-is-not-a-firefox-executable&quot; data-og-url=&quot;https://stackoverflow.com/questions/76846675/selenium-ubuntu22-bug-message-binary-is-not-a-firefox-executable&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zgWLw/hyTFoTFdg8/nh9CsruUKdks1aiRKuYCt1/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/76846675/selenium-ubuntu22-bug-message-binary-is-not-a-firefox-executable&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/76846675/selenium-ubuntu22-bug-message-binary-is-not-a-firefox-executable&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zgWLw/hyTFoTFdg8/nh9CsruUKdks1aiRKuYCt1/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;Selenium/Ubuntu22 bug &quot;Message: binary is not a Firefox executable&quot;&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Curious, does anyone here know how I might fix this Selenium/Ubuntu22 bug? Got a Python3 script that still runs fine on Debian 12, but I'm trying to use it on Ubuntu22 with firefox and geckodriver ...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래는 그냥 Chrome을 사용하려고 했었는데, 제가 시도하려는 환경은 ARM64 Ubuntu인데 크롬은 ARM64 Linux용 빌드가 없는 것 같더라구요. 그래서 Firefox를 사용하려다 보니 이런 에러를 만나게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ubuntu에서 Firefox을 사용해보려는 중에도 꽤 많이 헤멨는데 이것저것 닥치는대로 해보다보니 정리가 안되서 과정 공유는 좀 힘들 것 같네요.&lt;/p&gt;</description>
      <category>Python</category>
      <category>Firefox</category>
      <category>Python</category>
      <category>selenium</category>
      <category>ubuntu</category>
      <category>wsl2</category>
      <author>john.k</author>
      <guid isPermaLink="true">https://studyprogram.tistory.com/291</guid>
      <comments>https://studyprogram.tistory.com/entry/Python-Selenium-Firefox-%EC%82%AC%EC%9A%A9-%EC%8B%9C-Message-binary-is-not-a-Firefox-executable-%EC%97%90%EB%9F%AC#entry291comment</comments>
      <pubDate>Sat, 19 Aug 2023 14:09:42 +0900</pubDate>
    </item>
    <item>
      <title>PostgreSQL 15 윈도우 10 설치 시 에러</title>
      <link>https://studyprogram.tistory.com/entry/PostgreSQL-15-%EC%9C%88%EB%8F%84%EC%9A%B0-10-%EC%84%A4%EC%B9%98-%EC%8B%9C-%EC%97%90%EB%9F%AC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;PostgreSQL을 윈도우에서 설치하기 위해 홈페이지에서 인스톨러를 다운받고 실행했는데,&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;Postgresql:&amp;nbsp;Error&amp;nbsp;running&amp;nbsp;c:\\...getlocales.exe&amp;nbsp;:&amp;nbsp;child&amp;nbsp;killed:&amp;nbsp;unknown&amp;nbsp;signal&lt;/p&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;getlocales.exe를 실행하기 위해 Microsoft Visual C++ Redistributable packages 가 필요했습니다.&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://aka.ms/vs/17/release/vc_redist.x64.exe&quot;&gt;https://aka.ms/vs/17/release/vc_redist.x64.exe&lt;/a&gt;&lt;/p&gt;</description>
      <category>Database/PostgreSQL</category>
      <category>PostgreSQL</category>
      <category>PostgreSQL 설치 시 에러</category>
      <author>john.k</author>
      <guid isPermaLink="true">https://studyprogram.tistory.com/290</guid>
      <comments>https://studyprogram.tistory.com/entry/PostgreSQL-15-%EC%9C%88%EB%8F%84%EC%9A%B0-10-%EC%84%A4%EC%B9%98-%EC%8B%9C-%EC%97%90%EB%9F%AC#entry290comment</comments>
      <pubDate>Tue, 15 Aug 2023 16:29:17 +0900</pubDate>
    </item>
    <item>
      <title>Alembic alembic.ini 파일 sqlalchemy.url 동적으로 수정하기</title>
      <link>https://studyprogram.tistory.com/entry/Alembic-alembicini-%ED%8C%8C%EC%9D%BC-sqlalchemyurl-%EB%8F%99%EC%A0%81%EC%9C%BC%EB%A1%9C-%EC%88%98%EC%A0%95%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Alembic의 alembic.ini 파일에 이런 식으로 DB 주소를 적는데요.&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;sqlalchemy.url = postgresql://user:password@localhost:5432/database_name&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 환경변수에 저장된 DB 주소를 불러오고 싶었는데, ini 파일이라서 환경변수를 사용할 수가 없었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 방법을 찾아 본 결과 alembic init을 한 디렉토리에 있는 env.py 파일에서 다음과 같은 코드를 입력하는 방법이 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;config.set_main_option(&quot;sqlalchemy.url&quot;, os.getenv(&quot;DATABASE_URL&quot;, &quot;postgresql://user:password@localhost:5432/database_name&quot;))&lt;/code&gt;&lt;/pre&gt;
&lt;/div&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;이렇게 해서 동적으로 alembic의 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;a href=&quot;https://stackoverflow.com/questions/37890284/ini-file-load-environment-variable&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/37890284/ini-file-load-environment-variable&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1691724812743&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;.ini file load environment variable&quot; data-og-description=&quot;I am using Alembic for migrations implementation in a Flask project. There is a alembic.ini file where the database configs must be specified: sqlalchemy.url = driver://user:password@host/dbname Is&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/37890284/ini-file-load-environment-variable&quot; data-og-url=&quot;https://stackoverflow.com/questions/37890284/ini-file-load-environment-variable&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/4HFCu/hyTCDibYsJ/Hs3L527GABaJsaktoPnCi0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/37890284/ini-file-load-environment-variable&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/37890284/ini-file-load-environment-variable&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/4HFCu/hyTCDibYsJ/Hs3L527GABaJsaktoPnCi0/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;.ini file load environment variable&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I am using Alembic for migrations implementation in a Flask project. There is a alembic.ini file where the database configs must be specified: sqlalchemy.url = driver://user:password@host/dbname Is&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.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>Python</category>
      <category>alembic</category>
      <category>Database</category>
      <category>Python</category>
      <author>john.k</author>
      <guid isPermaLink="true">https://studyprogram.tistory.com/289</guid>
      <comments>https://studyprogram.tistory.com/entry/Alembic-alembicini-%ED%8C%8C%EC%9D%BC-sqlalchemyurl-%EB%8F%99%EC%A0%81%EC%9C%BC%EB%A1%9C-%EC%88%98%EC%A0%95%ED%95%98%EA%B8%B0#entry289comment</comments>
      <pubDate>Fri, 11 Aug 2023 12:36:50 +0900</pubDate>
    </item>
    <item>
      <title>Gunicorn access_log_format이 적용되지 않는 문제</title>
      <link>https://studyprogram.tistory.com/entry/Gunicorn-accesslogformat%EC%9D%B4-%EC%A0%81%EC%9A%A9%EB%90%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EB%AC%B8%EC%A0%9C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;FastAPI 앱을 만들어서 배포해보는 프로젝트를 하는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gunicorn 로그 포맷이 바뀌지 않는 문제가 있었습니다.&lt;/p&gt;
&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/encode/uvicorn/issues/527&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/encode/uvicorn/issues/527&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1691465677899&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;Honor gunicorn access log format &amp;middot; Issue #527 &amp;middot; encode/uvicorn&quot; data-og-description=&quot;When running under gunicorn, --access-logformat isn't honored. There was some discussion of this in #389, but I didn't see an open issue for it.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/encode/uvicorn/issues/527&quot; data-og-url=&quot;https://github.com/encode/uvicorn/issues/527&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://github.com/encode/uvicorn/issues/527&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/encode/uvicorn/issues/527&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;Honor gunicorn access log format &amp;middot; Issue #527 &amp;middot; encode/uvicorn&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;When running under gunicorn, --access-logformat isn't honored. There was some discussion of this in #389, but I didn't see an open issue for it.&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;Gunicorn Github 쪽에도 이슈가 있는데, Uvicorn worker를 사용할 때 Gunicorn access_log_format이 적용되지 않는 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내용을 대충 보니 Uvicorn 쪽에서 해결되어야 한다고 하는 거 같은데 아직 해결이 안된 것으로 보입니다.&lt;/p&gt;</description>
      <category>Python</category>
      <category>gunicorn</category>
      <category>logging</category>
      <category>Python</category>
      <category>uvicorn</category>
      <author>john.k</author>
      <guid isPermaLink="true">https://studyprogram.tistory.com/288</guid>
      <comments>https://studyprogram.tistory.com/entry/Gunicorn-accesslogformat%EC%9D%B4-%EC%A0%81%EC%9A%A9%EB%90%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EB%AC%B8%EC%A0%9C#entry288comment</comments>
      <pubDate>Tue, 8 Aug 2023 12:39:11 +0900</pubDate>
    </item>
    <item>
      <title>애드센스 핀 번호 재 발송 및 도착</title>
      <link>https://studyprogram.tistory.com/entry/%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%ED%95%80-%EB%B2%88%ED%98%B8-%EC%9E%AC-%EB%B0%9C%EC%86%A1-%EB%B0%8F-%EB%8F%84%EC%B0%A9</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;블로그 관리를 안하고 있다가 광고가 중단된 것을 확인했습니다.&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;이메일 함을 찾아보니 22년 6월쯤에 핀 번호 보냈다는 메일이 와있었네요.&lt;/p&gt;
&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;4개월 지나도록 인증을 안한 상태여서 광고가 중단되었었던 것 입니다.&lt;/p&gt;
&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;이번에도 우편물이 제대로 안오면 어쩌나 싶었는데 2주 정도 시간이 지나서 우편물을 받아볼 수 있었습니다.&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;/p&gt;
&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>john.k</author>
      <guid isPermaLink="true">https://studyprogram.tistory.com/287</guid>
      <comments>https://studyprogram.tistory.com/entry/%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%ED%95%80-%EB%B2%88%ED%98%B8-%EC%9E%AC-%EB%B0%9C%EC%86%A1-%EB%B0%8F-%EB%8F%84%EC%B0%A9#entry287comment</comments>
      <pubDate>Sat, 20 May 2023 21:49:24 +0900</pubDate>
    </item>
    <item>
      <title>Heroku 무료 서비스 종료</title>
      <link>https://studyprogram.tistory.com/entry/Heroku-%EB%AC%B4%EB%A3%8C-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%A2%85%EB%A3%8C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;얼마전에 이메일을 확인하다가 Heroku(헤로쿠) 에서 온 이메일을 봤습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내용을 보니까 2022년 11월 28일부터 무료 서비스(Dyno, Postgres, Redis)를 종료한다는 내용이더라구요.&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나 이외 클라우드에서는 프리 티어가 한정적으로 제공되는 것으로 알고 있는데,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Heroku는 월 사용량 기준으로 무료 사용량을 계속 줘서 오래 사용할 수 있었습니다.&lt;/p&gt;
&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;heroku.PNG&quot; data-origin-width=&quot;655&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s9NHh/btrLwzWcMMB/xByVbOjzQis13tu0iv8n5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s9NHh/btrLwzWcMMB/xByVbOjzQis13tu0iv8n5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s9NHh/btrLwzWcMMB/xByVbOjzQis13tu0iv8n5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs9NHh%2FbtrLwzWcMMB%2FxByVbOjzQis13tu0iv8n5K%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;655&quot; height=&quot;592&quot; data-filename=&quot;heroku.PNG&quot; data-origin-width=&quot;655&quot; data-origin-height=&quot;592&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;</description>
      <category>클라우드/Heroku</category>
      <category>heroku</category>
      <category>헤로쿠</category>
      <author>john.k</author>
      <guid isPermaLink="true">https://studyprogram.tistory.com/286</guid>
      <comments>https://studyprogram.tistory.com/entry/Heroku-%EB%AC%B4%EB%A3%8C-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%A2%85%EB%A3%8C#entry286comment</comments>
      <pubDate>Mon, 5 Sep 2022 23:55:34 +0900</pubDate>
    </item>
    <item>
      <title>백엔드 프로젝트 (GitHub Action) -4-</title>
      <link>https://studyprogram.tistory.com/entry/%EB%B0%B1%EC%97%94%EB%93%9C-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;저번에는 FastAPI 앱을 만들어서 Github에 올린 후, Heroku 앱과 연결하여 배포했습니다.&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;전체적인 흐름은 Github 저장소의 Branch를 develop, master(main)로 나누어서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;develop에서 개발을 해서 master에 Pull request를 만들면 테스트를 하고 통과하는 것을 확인하고 merge 한 뒤,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;master에서 heroku로 배포하게 됩니다.&lt;/p&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 저장소에서 develop Branch를 만듭니다.&lt;/p&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 Action 두개를 추가해서 바꿀 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1643789719602&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# .github/workflows/python_test.yml

name: Python application

on: pull_request

jobs:
  build:

    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set up Python 3.9
      uses: actions/setup-python@v2
      with:
        python-version: 3.9

    - name: Setup PostgreSQL
      uses: Harmon758/postgresql-action@v1.0.0
      with:
        postgresql version: '13'
        postgresql db: 'sample_app_dev'
        postgresql user: 'postgres'
        postgresql password: '1234'

    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        if [ -f ./requirements.txt ]; then pip install -r ./requirements.txt; fi

    - name: Test with pytest
      env:
        TEST: &quot;TEST&quot;
      run: |
        cd app
        PYTHONPATH=./app pytest tests -q&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 액션은 pull request시 테스트를 실행하는 액션입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트에서 사용하는 PostgreSQL을 설치하고 pytest를 실행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1643789826383&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# .github/workflows/deploy.yml

name: Heroku Deploy

on:
  push:
    branches: [ master ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up Python 3.9.10

      uses: actions/setup-python@v2
      with:
        python-version: 3.9.10

    - name: Deploy to Heroku
      # You may pin to the exact commit or the version.
      # uses: AkhileshNS/heroku-deploy@79ef2ae4ff9b897010907016b268fd0f88561820
      uses: AkhileshNS/heroku-deploy@v3.12.12
      with:
        # This will be used for authentication. You can find it in your heroku homepage account settings
        heroku_api_key: ${{ secrets.HEROKU_API_KEY }}
        # Email that you use with heroku
        heroku_email: ${{ secrets.HEROKU_EMAIL }}
        # The appname to use for deploying/updating
        heroku_app_name: ${{ secrets.HEROKU_APP_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;이 액션은 master 브랜치에 push되었을 때 Heroku에 배포하는 액션입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배포할 GitHub 저장소 Secret에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HEROKU_API_KEY,&amp;nbsp; HEROKU_EMAIL, HEROKU_APP_NAME을 설정해줘야 합니다.&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;PR 생성 중.PNG&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;792&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wUYSQ/btrskuTY1JW/qSX1SYGZ6HfeEcbfcMw7XK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wUYSQ/btrskuTY1JW/qSX1SYGZ6HfeEcbfcMw7XK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wUYSQ/btrskuTY1JW/qSX1SYGZ6HfeEcbfcMw7XK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwUYSQ%2FbtrskuTY1JW%2FqSX1SYGZ6HfeEcbfcMw7XK%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;1308&quot; height=&quot;792&quot; data-filename=&quot;PR 생성 중.PNG&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;792&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 PR을 만들면 GitHub Action (Python application / build (pull_request))이 돌아가는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;merge하면 master에 push 되면서 Heroku에 배포하는 액션이 돌아 배포하게 됩니다.&lt;/p&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/br-kim/fastapi-project/tree/master/.github/workflows&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/br-kim/fastapi-project/tree/master/.github/workflows&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1643789199849&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 - br-kim/fastapi-project&quot; data-og-description=&quot;Contribute to br-kim/fastapi-project development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/br-kim/fastapi-project/tree/master/.github/workflows&quot; data-og-url=&quot;https://github.com/br-kim/fastapi-project&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/5VLm0/hyNhMFzGS9/5K9SW0P0GhRoJXMLt6uaOk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/br-kim/fastapi-project/tree/master/.github/workflows&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/br-kim/fastapi-project/tree/master/.github/workflows&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/5VLm0/hyNhMFzGS9/5K9SW0P0GhRoJXMLt6uaOk/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 - br-kim/fastapi-project&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to br-kim/fastapi-project 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;여기에서도 Github Action 코드를 확인해보실 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 Terraform으로 클라우드 서비스를 생성한 뒤, Github에 코드를 올려 테스트와 배포를 자동으로 하는 과정을 한번 둘러 보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 말씀드렸다시피 이 과정들이 Best Practice 완벽한 모범 사례라고 보기는 힘들기때문에&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;Terraform이 아닌 다른 IaC 서비스를 사용한다던가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Heroku가 아닌 다른 클라우드 서비스를 사용해볼 수도 있고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니면 FastAPI가 아닌 Django나 다른 언어의 웹 프레임워크를 사용해볼 수도 있고,&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>FastAPI</category>
      <category>github actions</category>
      <category>heroku</category>
      <author>john.k</author>
      <guid isPermaLink="true">https://studyprogram.tistory.com/285</guid>
      <comments>https://studyprogram.tistory.com/entry/%EB%B0%B1%EC%97%94%EB%93%9C-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-4#entry285comment</comments>
      <pubDate>Wed, 2 Feb 2022 16:16:47 +0900</pubDate>
    </item>
    <item>
      <title>백엔드 프로젝트 (FastAPI, Heroku) -3-</title>
      <link>https://studyprogram.tistory.com/entry/%EB%B0%B1%EC%97%94%EB%93%9C-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-3</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 FastAPI를 이용하여 간단하게 DB를 사용하는 앱을 만들고 테스트까지 작성해봤습니다.&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;코드량이 많아서 블로그에 다 올리는 것은 힘들 것 같고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GitHub 저장소를 참고하시는게 좋을 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트를 실행해볼 때는 환경변수 TEST 키를 생성하여 값을 TEST로 설정해줘야 config.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;Github에 올리고 처음에 생성한 Heroku 앱과 연동하여 배포를 할 수 있습니다.&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;헤로쿠 깃허브.PNG&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw4Rif/btrskEvgDxZ/XLnSSEL7ViN2Avx2xklHCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw4Rif/btrskEvgDxZ/XLnSSEL7ViN2Avx2xklHCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw4Rif/btrskEvgDxZ/XLnSSEL7ViN2Avx2xklHCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw4Rif%2FbtrskEvgDxZ%2FXLnSSEL7ViN2Avx2xklHCK%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;1242&quot; height=&quot;447&quot; data-filename=&quot;헤로쿠 깃허브.PNG&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Deployment method에서 GitHub를 클릭하고 저장소를 선택하면 됩니다.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음에서는 Heroku에 배포하기 전 Github 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;배포된 서버에 접속해서 Chrome 개발자 도구 콘솔에서 다음과 같이 입력해서 DB에 글 작성을 테스트 해볼 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1643712919294&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;data = {email:&quot;test@email.com&quot;, title:&quot;title&quot;, content:&quot;content&quot;}

await fetch(&quot;/posts&quot;,{method: &quot;POST&quot;, headers: {
      'Content-Type': 'application/json'
    }, body: JSON.stringify(data)})&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;해당 GitHub 저장소 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/br-kim/fastapi-project&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/br-kim/fastapi-project&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1643788519002&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 - br-kim/fastapi-project&quot; data-og-description=&quot;Contribute to br-kim/fastapi-project development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/br-kim/fastapi-project&quot; data-og-url=&quot;https://github.com/br-kim/fastapi-project&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/sIrNM/hyNhX1o2Ug/NPYk5qvb9wcqiRUpIbi7e1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/br-kim/fastapi-project&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/br-kim/fastapi-project&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/sIrNM/hyNhX1o2Ug/NPYk5qvb9wcqiRUpIbi7e1/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 - br-kim/fastapi-project&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to br-kim/fastapi-project 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>FastAPI</category>
      <category>heroku</category>
      <category>Python</category>
      <author>john.k</author>
      <guid isPermaLink="true">https://studyprogram.tistory.com/284</guid>
      <comments>https://studyprogram.tistory.com/entry/%EB%B0%B1%EC%97%94%EB%93%9C-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-3#entry284comment</comments>
      <pubDate>Tue, 1 Feb 2022 17:42:19 +0900</pubDate>
    </item>
  </channel>
</rss>