<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>frostix-kaname</title>
        <link>https://velog.io/</link>
        <description>B!nfo Project | Back-end Developer</description>
        <lastBuildDate>Wed, 29 Oct 2025 07:35:04 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>frostix-kaname</title>
            <url>https://velog.velcdn.com/images/frost-ix/profile/99b2246e-baf1-4c47-acc0-c36d946682aa/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. frostix-kaname. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/frost-ix" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[보유한 음원을 스트리밍으로 들어보기]]></title>
            <link>https://velog.io/@frost-ix/amperfy</link>
            <guid>https://velog.io/@frost-ix/amperfy</guid>
            <pubDate>Wed, 29 Oct 2025 07:35:04 GMT</pubDate>
            <description><![CDATA[<h3 id="갖고있는-음원을-편하게-들어보자">갖고있는 음원을 편하게 들어보자</h3>
<blockquote>
<p>실제 사용 이미지
<img src="https://velog.velcdn.com/images/frost-ix/post/ef54b9ec-f97b-457c-ad36-f67f0292b311/image.PNG" alt=""></p>
</blockquote>
<p><a href="https://www.navidrome.org/">navidrome official site</a>
<a href="https://www.navidrome.org/docs/installation/docker/">navidrome docker docs</a></p>
<p>navidrome은 오픈소스 음악 서버 및 스트리머 서비스 입니다
설치를 하게 되면 웹플레이어로서 동작을 하는 그런 친구입니다</p>
<p>물론 서버로도 동작하기 때문에 third-party 어플리케이션에서 url를 입력하게 되면 해당 리소스를 가져와서 사용도 가능 합니다</p>
<p>navidrome은 저에게 익숙한 docker를 활용 합니다</p>
<p>제가 셋팅 한 docker compose는 아래와 같아요</p>
<pre><code class="language-yaml">services:
  navidrome:
    image: deluan/navidrome:latest
    ports:
    # 포워딩 할 포트는 자유롭게 변경
    # 뒤에 있는 포트는 변경 X
    # 포워딩 포트로 web 접근
      - &quot;4533:4533&quot;
    restart: unless-stopped
    volumes:
      - &quot;설정파일 위치:/data&quot;
      - &quot;음악이 있는 위치:/music:ro&quot;</code></pre>
<p>Custom configuration은 navidrome.toml을 통해 configuration 설정을 해줄 수 있는데
저의 경우엔 transcoding cache size나 Scanner schedule 설정은 추후 적용 예정이라 별도로 주지않았습니다</p>
<p>이걸 실행 후 해당 포트로 접속하면 계정을 생성하라고 합니다
초기화면에서 계정 생성 후 본 페이지로 들어가면
<img src="https://velog.velcdn.com/images/frost-ix/post/8967763b-9c43-47e5-9199-c2df8e0e7aba/image.png" alt="">
요런 페이지가 나오면 성공 입니다
음원의 경우 navidrome이 볼륨 마운트를 시킨 위치의 곡들을 전부 자동으로 읽습니다</p>
<p>이제 앱과 서버를 연결 해줄 차례인데
앱으로는 amperfy 라는걸 채택 했습니다
앱스토어에서 무료이기도 하고 ui가 깔끔한게 마음에 들어서..</p>
<p><a href="https://github.com/BLeeEZ/amperfy">amperfy github</a></p>
<p><img src="https://velog.velcdn.com/images/frost-ix/post/92185fab-40d5-4b60-92a9-51836d1f9eb5/image.jpeg" alt=""></p>
<p>저는 사용중인 proxy manager와 domain이 있어서 navidrome의 포트와 domain을 연결 해주었습니다</p>
<p>URL은 navidrome이 설치 된 서버의 ip 또는 도메인을 넣어주면 되고
계정의 경우 navidrome 초기화면에서 생성했던 계정을 입력하면 됩니다 </p>
<p>로그인이 성공되면 amperfy가 navidrome 서버와 통신하면서 곡을 읽어옵니다</p>
<p>이후엔 스트리밍 앱 사용하는 것 처럼 쓰시면 됩니다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[BestdoriAPI  탐구]]></title>
            <link>https://velog.io/@frost-ix/whatIsBestdoriAPI</link>
            <guid>https://velog.io/@frost-ix/whatIsBestdoriAPI</guid>
            <pubDate>Sun, 20 Jul 2025 13:03:20 GMT</pubDate>
            <description><![CDATA[<h2 id="bestdori">Bestdori?</h2>
<blockquote>
<p>홈페이지 : <a href="https://www.bestdori.com">Bestdori</a></p>
</blockquote>
<p>현재 BanGDream! Girls Band Party 라는 게임의 대부분의 정보를 제공해주고 있는 사이트 입니다.
캐릭터며, 카드며, 의상이며, 곡이며 전부 다 열람이 가능합니다.</p>
<h2 id="bestdoriapi">BestdoriAPI?</h2>
<p>앞서 설명드린 Bestdori의 개발자가 제공하는 API가 있습니다.</p>
<p>해당 API는 <a href="https://github.com/WindowsSov8forUs/bestdori-api">Bestdori-Github</a> 로 소스코드가 공개 되어있고
Github Pages를 사용하여 docs를 퍼블리싱까지 해둔 것으로 확인 됩니다. <a href="https://docs.bestdori.winsov8.win/api/cards">Bestdori-api docs</a></p>
<h3 id="사용방법">사용방법</h3>
<p>해당 api는 python 모듈을 설치하여 사용하게 됩니다.</p>
<pre><code class="language-shell"># pip 모듈 설치
pip3 install bestdori-api</code></pre>
<pre><code class="language-python"># 해당 모듈을 사용하려면
from bestdori.post import Post # 또는 bands ... char ... events 등등

# post의 데이터를 불러오는 예제
def main() -&gt; None:
    # 게시판 id를 Post 함수로 넘겨서 값을 받음
    p = Post(id=&#39;111533&#39;)
    # 받은 값의 디테일은 get_details()를 호출하여 추출
    info = p.get_details()
    print(info)

main()

# https://docs.bestdori.winsov8.win/fast-start</code></pre>
<h3 id="이걸-어떻게-사용-할-것인가">이걸 어떻게 사용 할 것인가?</h3>
<p>기존에는 Swagger api docs에서 찾은 BanGDream database unofficial api (<a href="https://masayuki-0319.github.io/magi-circles-bang-dream-openapi/#/">링크</a>) 를 활용하여 게임 데이터를 다루고 있었는데
Bestdori 데이터 형식을 파악한 이후 방향성을 잡을 계획 입니다.</p>
<p>+) NestJS로 API서버를 구성했으나 해당 api 이용을 위해 FastAPI로 변경 할 계획 입니다...ㅠㅠ
게임 정보쪽 백엔드와 뱅드림 관련 정보쪽 백엔드가 분리 되어있어서 그나마 다행인가 싶은 순간이네요</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Adguard home 적용기]]></title>
            <link>https://velog.io/@frost-ix/adguard-home</link>
            <guid>https://velog.io/@frost-ix/adguard-home</guid>
            <pubDate>Wed, 02 Jul 2025 09:34:16 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>집 안에서까지 광고를 봐야할까</p>
</blockquote>
<h3 id="adguard-home">adguard Home</h3>
<p>광고차단 application으로 유명한 adguard의 오픈소스 소프트웨어 입니다
관심을 갖게 된 계기는 adguard 유료의 기기 제한이 3대여서 입니다... 너무 적어요
계속 구입하자니 adguard 홈페이지에서 계정을 변경해가며 기기 등록 및 관리하는게 귀찮기도 하고 해서
docker image가 있으면 컨테이너로 돌리면 되지않을까? 싶은 생각에 적용을 하게 되었습니다</p>
<h3 id="docker">docker</h3>
<blockquote>
<p>Docker와 Docker compose가 설치 되어있다는 전제하에 읽어주세요</p>
</blockquote>
<p>해당 오픈소스 소프트웨어는 docker image가 있습니다
[Docker hub - Adguard Home] (<a href="https://hub.docker.com/r/adguard/adguardhome">https://hub.docker.com/r/adguard/adguardhome</a>) 에서 해당 image를 확인 할 수 있어요
저같은 경우 해당 image를 docker-compose에 넣어서 latest로 pull 받고 컨테이너를 만들게끔 해두었습니다</p>
<p>아래는 해당 yml 파일 이에요</p>
<pre><code class="language-yml"># docker-compose.yml
services:
    adguardhome:
        image: adguard/adguardhome
        container_name: adguardhome
        # always와 unless-stopped는 사용성에 맞게 적용합시다
        restart: unless-stopped
        volumes:
          # 각종 설정값을 백업하기 위한 볼륨 마운트
          # 장비 경로 : docker container 내부 경로 입니다
          - /~~/work:/opt/adguradhome/work
          - /~~/conf:/opt/adguardhome/conf
        ports:
          - &quot;53:53/tcp&quot;
          - &quot;53:53/udp&quot;
          - &quot;853:853/tcp&quot;
          # ???? &lt;-- 본인이 적용하고자 하는 port 입력
          - &quot;????:9393/tcp&quot; # adguard home의 컨트롤 패널 접속 port
          - &quot;????:3000/tcp&quot; # 초기 셋업 port</code></pre>
<pre><code class="language-shell">docker compose up -d</code></pre>
<h3 id="사용법">사용법</h3>
<blockquote>
<p>해당 docker container가 돌아갈 장비의 로컬 ip는 static하게</p>
</blockquote>
<p>장비에 별다른 네트워크 수정을 하지 않았다면 대부분의 장비는 사설 ip를 AP의 DHCP 서버로부터 할당받게 됩니다
이 경우 adguard home이 돌아갈 장비의 ip가 변경될 경우 작동하지 않는 상황이 발생하기 때문에
해당 장비의 ip는 <strong>꼭 정적할당을 해줘야 합니다</strong></p>
<h4 id="adguard-home-공유기-적용-순서">adguard home 공유기 적용 순서</h4>
<ol>
<li>adguard Home이 돌아가는 장비의 IP를 고정 시킨다</li>
<li>본인이 사용하는 공유기의 웹 설정에 들어간다</li>
<li>고정시킨 IP를 공유기의 인터넷 설정 정보에서 기본 DNS 주소에 넣어준다 &lt;&lt; <strong>이 부분 때문에 정적할당을 해야합니다</strong></li>
<li>1 (선택)공유기를 재시작 해준다</li>
</ol>
<p>이와 같이 순서를 지키게 된다면 해당 container를 통해 adguard 필터가 공유기를 사용하는 모든 장비에 적용됩니다</p>
<h3 id="adguard-home-설정">adguard home 설정</h3>
<p>container를 정상적으로 올리고 dns를 설정 한 이후에는 해당 application에 접근하여 광고차단 filter를 적용해줄 시간 인데요
링크에 <strong>장비ip:초기셋업 port</strong>를 입력해서 접속 해줍니다</p>
<p>본인이 사용할 계정을 입력해주고 간단한 셋업을 하고나면 아래와 같이 adguard 패널 사이트가 나오게 됩니다
<img src="https://velog.velcdn.com/images/frost-ix/post/9f500255-c5f2-4c43-9e5d-23dbcb71bf12/image.png" alt="실제 사용 화면">
여기서 필터 - DNS 차단 목록을 누른 다음
<img src="https://velog.velcdn.com/images/frost-ix/post/49ced321-8164-4d3e-ae89-0cbb7298ffdb/image.png" alt="">
차단 목록 추가를 눌러서 원하는 항목을 추가해주면 자동으로 적용되며 설정이 됩니다</p>
<h3 id="설정이-끝나면">설정이 끝나면</h3>
<p>이제 해당 공유기에 연결된 장비는 모두 광고차단이 될 것 입니다
이걸 활용하면 공유기에 따라 vpn을 설정하여 집 네트워크에 연결한다면 밖에서도 사용 가능하니 굉장히 유용하게 사용할 수 있겠습니다
저의 경우 iptime을 사용중이라 wireGuard를 이용하여 해당 dns를 사용하고 있는데 정말 편리합니다
관리 할 걱정을 덜어내서 만족스러워요 :)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Custom property를 활용하자]]></title>
            <link>https://velog.io/@frost-ix/b-info-customproperty</link>
            <guid>https://velog.io/@frost-ix/b-info-customproperty</guid>
            <pubDate>Tue, 01 Jul 2025 13:12:29 GMT</pubDate>
            <description><![CDATA[<h2 id="custom-property">Custom Property?</h2>
<p>resource 폴더 밑에 있는 공통 어플리케이션 속성들을 지정하는 파일인
<strong>application.properties</strong> 내부 속성에 커스텀하고자 하는 property를 지정하는 전략 입니다</p>
<h3 id="사용하면-어떤-부분이-좋을까">사용하면 어떤 부분이 좋을까?</h3>
<p>custom property는 두번째로 사용하게 되었는데요
사용하면서 느낀 바로는 ** 상수값들의 관리 용이성 ** 이라고 생각 합니다
처음 써봤을 때 &#39;학생 때 이걸 적용 해볼 생각을 왜 못했을까..&#39; 하며 과거 회상을 했었습니다</p>
<p>지금은 신규 Spring 프로젝트를 진행하게 된다면 경우에 따라 선적용 할 거 같습니다</p>
<h3 id="이-프로젝트에-어떻게-활용-하고-있냐면">이 프로젝트에 어떻게 활용 하고 있냐면</h3>
<p>webConfig 규칙 중 cors에 allow-origins을 대입할 때
prod, dev properties를 구분하여 값을 가져오게 적용 하고 있습니다
dev에선 전체 허용, prod에선 NginX만 허용하도록 하는 방식으로 말이죠</p>
<h3 id="code">Code</h3>
<p>Kotlin 기준 아래와 같이 작성해서 사용 중 입니다</p>
<pre><code class="language-kotlin">/**
* PropertyValue
* Allow 해줄 Origins를 application.properties로 부터 가져와야 합니다
*/
@Getter
@Setter
class AllowOrigins {
    // origins는 1 또는 n개가 될 수 있으니 List타입으로 지정 해줍니다
    var allowedOrigis: List&lt;String&gt; = emptyList()

    override fun toString(): String {
        // 여기서는 xxx.yyy=~~~ 중 yyy에 해당하는 부분을 작성합니다
        return &quot;AllowOrigins(allowedOrigins=$allowedOrigins)&quot;
    }
}</code></pre>
<p>위와 같이 Property Value를 작성한 것을 토대로 CustomProperty Component를 제작 합니다</p>
<pre><code class="language-kotlin">@Component
class CustomProperty {
    // prefix는 xxx.yyy=~~ 중 xxx에 해당되는 부분을 작성 합니다
    @Bean
    @ConfigurationProperties(prefix = &quot;[custom name]&quot;)

    // allowedOrigins는 위에서 생성한 객체를 반환 해줍니다
    fun allowedOrigins(): AllowOrigins {
        return AllowOrigins()
      }
}</code></pre>
<p>제작이 되고나면 아래와 같이 활용 해볼 수 있습니다</p>
<pre><code class="language-kotlin">// Spring boot WebConfig에서의 활용법
@Configuration
@EnableWebFlux
class WebConfig: WebFluxConfigurer {
    // allowedOrigins를 가져와서 변수에 주입
    private val allowedOrigins: String = AllowOrigins().allowedOrigins.toString()

    override fun addCorsMappings(reg: CorsRegistry) {
        registry.allowedOrigins(allowedOrigins)
                .allowedOriginPatterns(&quot;*&quot;)
                // 그 외 여러 CORS 매핑 옵션을 추가 합니다
    }
}</code></pre>
<p>해당 값들은 application.properties 내부에 <strong>xxx.yyy=&quot;<del>~</del>&quot;</strong> 이런식으로 작성된 값을 가져오기 때문에
<strong>ConfigurationProperties(prefix = &quot;xxx&quot;)</strong> 그리고 <strong>yyy에 해당하는 PropertyValue</strong>
두 값의 매칭에 신경을 써주면 좋습니다</p>
<p>일치하지 않는다면 IDE에서 경고를 띄워주기 때문에 큰 문제는 아니지만, 한번에 되면 기분이 좋으니까요 👀</p>
<h3 id="한마디">한마디</h3>
<p>이 프로젝트를 진행하며 느낀 CustomProperty가 가지는 이점으로는 Develop, Production에서 <strong>다르게 쓰여야 할 상수값들의 관리</strong> 라고 생각합니다
처음 사용했을 때 보다 조금 더 친숙해지려고 이런저런 검색을 하다보니 응용을 어떻게 하면 좋을까 하는 고민도 하게 되네요 :)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[B!nfo Project 개발일지 (서론)]]></title>
            <link>https://velog.io/@frost-ix/b-info-intro</link>
            <guid>https://velog.io/@frost-ix/b-info-intro</guid>
            <pubDate>Mon, 30 Jun 2025 12:34:11 GMT</pubDate>
            <description><![CDATA[<h3 id="이-프로젝트가-뭔데">이 프로젝트가 뭔데?</h3>
<blockquote>
<p>뱅드림 걸즈밴드 파티의 각종 정보를 제공해주는 사이트 입니다</p>
</blockquote>
<p>글을 작성하는 2025-06-30 기준
뱅드림은 벌써 10년을 넘어가고 있는 일본회사인 부시로드의 미디어 믹스 프로젝트 입니다
한국에서는 모 기업이 운영을 했지만 .....
결국 게임이 섭종을 맞이한 ...
하지만 여전히 즐기는 사람이 많은, 그런 IP 라고 할 수 있겠습니다</p>
<p>최근 1~2년간 MyGO!!!!!, Ave Mujica를 선보이며 다시금 입지를 다지려는 행보를 보이는 부시로드 입니다
한국에서 애니를 보고 관심을 가져주는 분들이 조금씩 생기고 즐기는걸 공유 하는 사람들이 생기니 덩달아 저도 재밌게 즐기는 요즘 입니다</p>
<h3 id="그래서-이걸-왜-만드는데">그래서 이걸 왜 만드는데?</h3>
<p>앞서 얘기했듯 이 IP로 제작된 게임은 한국서버가 없습니다
그말인 즉슨, 일본어를 하지 못하면 접근하기 어렵다는 뜻이 되겠지요
저 또한 일본어에 강하지 않고 저와 비슷한 사람들이 많을거라 생각이 들어서</p>
<p><strong>&#39;그러면.. 여러 정보를 제공해주는 정보 제공 팬 사이트를 한국어로 개발 하면 되는거 아니야?&#39;</strong></p>
<p>에 도달하게 되어 개발하자! 마음 먹고 진행하고 있습니다</p>
<h3 id="그러면-개발일지-주기는">그러면 개발일지 주기는?</h3>
<p>비정기적으로 업로드 할 예정입니다
회사에서의 개발 업무랑 병행 하면서 진행 하고 있기때문에 제약이 있는 상황 입니다 ^^;</p>
<h3 id="무슨-기술스택을-쓰고-있는지-알려줘">무슨 기술스택을 쓰고 있는지 알려줘</h3>
<p>게시글 작성 전 부터 개발은 이미 하고 있었습니다 👀
사용하고 있는 기술스택은 아래와 같아요</p>
<p><strong>Front-end</strong></p>
<ul>
<li>Vue3 w.typescript</li>
<li>Vite + Quasar</li>
</ul>
<p><strong>Back-end</strong></p>
<ul>
<li>NestJS w.typescript : BanGDream! DB API</li>
<li>Spring WebFlux w.Kotlin : Main API</li>
</ul>
<p><strong>DB</strong></p>
<ul>
<li>MongoDB</li>
</ul>
<p><strong>etc..</strong></p>
<ul>
<li>Docker w.Portainer : Docker-network 활용</li>
<li>NginX : Front-end 배포용</li>
</ul>
<h3 id="끝으로-">끝으로 ...</h3>
<p>뱅드림 노래들 좋으니까 한번씩 검색해서 들어주세요
밴드 사운드 좋아하면 괜찮을거에요</p>
]]></description>
        </item>
    </channel>
</rss>