아티클

이희정

이희정

intro. 어느새 1년 반이 지나가고 있는 사이드 프로젝트를 돌아보며

안녕하세요, 저는 밤길 안심 통화 앱 <랜턴>을 만들고 있는 기획자 이희정입니다.

작년 5월에 기획자들끼리 모여 팀을 결성하고... 아이디어를 내고... 차근차근 디자이너와 개발자를 모집했네요.

팀원들이 나갔다가 다시 들어오고, 나갔다가 다시 들어오고.

그 과정에서 기획 역시 한 번 엎어져서 다 만들어둔 화면 설계서를 엎기도 하고...🥲

그렇게 1년이 지나가고, 1년 반을 향해 달리고 있는 사이드 프로젝트입니다.

저희는 처음에는 대학생들끼리 모여 진행했고, 이젠 저와 몇몇 팀원들은 졸업을 했네요.

한 번도 이런 앱 개발 프로젝트를 진행해 본 적도, 완벽하게 리더를 맡아본 적도 없는 제가 얼떨결에 PM을 맡아 고군분투 하고 있습니다.

비전공생이던 제가, 첫 사이드 프로젝트를 1년 동안 끌고 가게 되면서 어느 지점이 어려웠는지 적어보려고 해요.


  1. 기획 산출물, 대체 뭐가 뭔지 모르겠다! 처음에는 IA와 화면설계서와 기능명세서 등등...

    • 이 문서들이 각각 왜 필요한지 알지 못했다. 그래서 중복적으로 하게 된 경우도 있다. (왜 필요한지도 모르고 문서부터 작성하면 안 되는 예)

  2. 매니징, PM의 중요성을 몰랐고, (아마 이게 프로젝트를 길게 끈 요인인 거 같다) 어떻게 해야하는지도 몰랐다.

    • 특히 디자인 팀과 개발 팀 각각 어떤 프로세스로 진행하는지도 몰라 아직도 공부 중이다...

  3. 팀원을 구할 때 가장 중요한 개발 언어조차 모르고 있었다!!!

    • 알게 된 후에도 리액트 네이티브 -> IOS로 개발 언어가 바뀌게 되면서 개발자 분들과 아쉽게 헤어지게 되기도 해야했다... (다행히 프론트 분들은 작업 전이었다)

    • 이런 개발 언어의 차이 정도는 알아둬야 한다 정말ㅠ

  4. 조직문화에 정말 많은 고민을 했다! 회의나 회의록 시스템도 바뀌고.

    • 처음에는 Slack을 이용했다가 discord로 바꾸면서 협업툴도 바뀌고 했다. 이런 협업 툴이나 조직문화의 종류에 대해서도 알아두면 좋다.


등등... 지금 생각나는 것들만 적었는데, 이건 새발의 피입니다...ㅠㅠ 아직도 고민거리가 가득 넘쳐요.

이런 초보의 고군분투기도 누군가에게 도움이 되길 바라면서, 하나하나씩 적어가보겠습니다!

저랑 같이 초보 기획자, 첫 사이드 프로젝트로 고군분투 하는 분들과도 소통하고 싶어요.

댓글로 조언 등 도움 주시는 것도 너무 환영합니다! 앞으로 열심히 회고 해보겠습니다!

6
7
Cailyn Yong

Cailyn Yong

[Part 3] 2시간 안에 업무 자동화 AI Agent 만들기: 구글 검색 기능

AI Agent 만들기의 마지막 파트입니다.

Part 1: 전체 프로그램 셋업, OpenAI API 연결, Vector Store 연결

Part 2: 커스텀 LLM 체인 직접 만들고나서 실행하기

Part 3: Agent가 나 대신 실제 구글 검색하는 기능 만들기

SerpAPI key 받아오기

저번 파트에서 성공적으로 코드를 수행했다면 이제 AI 에이전트가 업무를 하기 위해 먼저 to-do list를 만들고 태스크 중 중요도가 높은 태스크부터 진행할 것입니다.

하지만 실제 구글 검색을 통해서 모은 자료가 아니기 때문에 정보가 정확하지 않고 hallucination 결과값들을 내뱉을 수 있습니다.

이번 파트에서는 이를 방지하고자 Google SerpAPI라는 것을 써서 에이전트가 실제 웹과 연결되어 구글링을 할 수 있도록 할 것입니다.

웹 검색을 하기 위해서는 Part 1에서 OpenAI를 쓰기 위해 OpenAI API secret key를 받은것처럼 SerpAPI key를 받아야합니다.

https://serpapi.com/ 여기로 가서 계정을 만든 다음, 옆에 API Dashboard라는 곳에서 Api key 버튼을 누르고 API key를 만드세요. OpenAI API key와 마찬가지로 이걸 복사해서 코드에 붙여넣을 겁니다.

import os
os.environ["OPENAI_API_KEY"] = " "
os.environ["SERPAPI_API_KEY"] = " "

기존 코드의 두번째 줄 바로 밑에 os.environ[”SERPAPI_API_KEY”] = “” 를 복붙하고 “ “ 사이에 방금 만든 SerpAPI key를 붙여넣으세요.

Part 1에서 나왔듯이 저희는 구글 검색을 가능하게 하려면 알맞는 모듈들을 불러와야합니다.

from collections import deque
from typing import Dict, List, Optional, Any

from langchain import LLMChain, OpenAI, PromptTemplate
from langchain.embeddings import OpenAIEmbeddings
from langchain.llms import BaseLLM
from langchain.vectorstores.base import VectorStore
from pydantic import BaseModel, Field
from langchain.chains.base import Chain

from langchain.vectorstores import FAISS
from langchain.docstore import InMemoryDocstore

기존의 모듈 코드(위 코드) 밑에 아래 코드를 붙여넣습니다.

from langchain.agents import ZeroShotAgent, Tool, AgentExecutor
from langchain import OpenAI, SerpAPIWrapper, LLMChain

이제 구글 검색이 가능한 LLM 체인을 만들겁니다.

Part 2에서 세번째 체인인 class ExecutionChain(LLMChain)은 현재 구글 검색이 불가능합니다. (아래 코드)

class ExecutionChain(LLMChain):
    """Chain to execute tasks."""

    @classmethod
    def from_llm(cls, llm: BaseLLM, verbose: bool = True) -> LLMChain:
        """Get the response parser."""
        execution_template = (
            "You are an AI who performs one task based on the following objective: {objective}."
            " Take into account these previously completed tasks: {context}."
            " Your task: {task}."
            " Response:"
        )
        prompt = PromptTemplate(
            template=execution_template,
            input_variables=["objective", "context", "task"],
        )
        return cls(prompt=prompt, llm=llm, verbose=verbose)

그래서 이 코드를 아래 코드로 대체할 것입니다.

todo_prompt = PromptTemplate.from_template(
    "You are a planner who is an expert at coming up with a todo list for a given objective. Come up with a todo list for this objective: {objective}"
)
todo_chain = LLMChain(llm=OpenAI(temperature=0), prompt=todo_prompt)
search = SerpAPIWrapper()
tools = [
    Tool(
        name="Search",
        func=search.run,
        description="useful for when you need to answer questions about current events",
    ),
    Tool(
        name="TODO",
        func=todo_chain.run,
        description="useful for when you need to come up with todo lists. Input: an objective to create a todo list for. Output: a todo list for that objective. Please be very clear what the objective is!",
    ),
]

prefix = """You are an AI who performs one task based on the following objective: {objective}. Take into account these previously completed tasks: {context}."""
suffix = """Question: {task}
{agent_scratchpad}"""
prompt = ZeroShotAgent.create_prompt(
    tools,
    prefix=prefix,
    suffix=suffix,
    input_variables=["objective", "task", "context", "agent_scratchpad"],
)

이 코드로 대체할 건데요, 기존의 코드와 이 새로운 코드랑 비교를 해봅시다.

가장 먼저 코드의 첫줄을 보면 todo_prompt가 있습니다. 이건 기존 코드의 프롬프트 템플릿과 똑같은 기능을 해주고 있습니다. 하지만 prompt의 내용이 바꼈는데요, 기존에는 그저 ‘태스크를 컨텍스트에 맞게 실행해라’였다면 이번에는 조금 더 구체적으로 먼저 todo list을 만들으라고 하네요.

이 템플릿을 기반으로 저희는 todo_chain을 다음 줄에서 만듭니다.

세번째 줄에 있는 search = SerpAPIWrapper()는 저희가 처음에 불러온 SerpAPI 검색 기능을 쓰기 위해 셋업을 해놓는 것입니다.

재미있게도 저희는 todo_chain이 쓰면 좋을만한 툴들을 만들어주고 이걸 적절한 상황에서 각 툴을 알맞게 쓸 수 있도록 할 수 있습니다.

tools = [ … ] 코드 블록을 보면 저희는 크게 두가지 툴, “Search” tool과 “TODO” tool을 만든 것을 볼 수 있습니다.

Search tool은 실제 구글 검색을 하면서 정확한 정보를 불러와야할때 쓰는 툴이 되는거고, TODO tool은 todo list을 만들어야 할때 쓰이는 툴이 되는 것입니다.

마지막으로 기존의 코드와 비슷한 코드 부분은 prefix = “…” 부터 prompt = ZeroShotAgent까지의 코드입니다. 여기서는 이제 만든 todo list을 기반으로 태스크를 하나씩 실행하게끔 하는 Agent을 만든겁니다.

거의 다 왔습니다.

기존 코드에서 바꿔야 할 부분이 몇가지 더 있습니다.

@classmethod
    def from_llm(
        cls, llm: BaseLLM, vectorstore: VectorStore, verbose: bool = False, **kwargs
    ) -> "BabyAGI":
        """Initialize the BabyAGI Controller."""
        task_creation_chain = TaskCreationChain.from_llm(llm, verbose=verbose)
        task_prioritization_chain = TaskPrioritizationChain.from_llm(
            llm, verbose=verbose
        )
        execution_chain = ExecutionChain.from_llm(llm, verbose=verbose)
        return cls(
            task_creation_chain=task_creation_chain,
            task_prioritization_chain=task_prioritization_chain,
            execution_chain=execution_chain,
            vectorstore=vectorstore,
            **kwargs,
        )

위 코드를 아래 코드와 같이 대체합니다.

@classmethod
    def from_llm(
        cls, llm: BaseLLM, vectorstore: VectorStore, verbose: bool = False, **kwargs
    ) -> "BabyAGI":
        """Initialize the BabyAGI Controller."""
        task_creation_chain = TaskCreationChain.from_llm(llm, verbose=verbose)
        task_prioritization_chain = TaskPrioritizationChain.from_llm(
            llm, verbose=verbose
        )
        llm_chain = LLMChain(llm=llm, prompt=prompt)
        tool_names = [tool.name for tool in tools]
        agent = ZeroShotAgent(llm_chain=llm_chain, allowed_tools=tool_names)
        agent_executor = AgentExecutor.from_agent_and_tools(
            agent=agent, tools=tools, verbose=True
        )
        return cls(
            task_creation_chain=task_creation_chain,
            task_prioritization_chain=task_prioritization_chain,
            execution_chain=agent_executor,
            vectorstore=vectorstore,
            **kwargs,
        )

기존 코드에서 만들었던 세번째 체인, execution_chain = ExecutionChain.from_llm(llm, verbose=verbose) 코드 대신 저희가 만든 구글 검색 기능이 가능한 ZeroShotAgent으로 바꿔줘야합니다.

return cls (…) 부분에서 execution_chain=execution_chain도 execution_chain=agent_executor로 대체합니다.

llm_chain = LLMChain(llm=llm, prompt=prompt)
tool_names = [tool.name for tool in tools]
agent = ZeroShotAgent(llm_chain=llm_chain, allowed_tools=tool_names)
agent_executor = AgentExecutor.from_agent_and_tools(
    agent=agent, tools=tools, verbose=True
)

새롭게 추가된 코드를 좀 더 자세히 들여다보면, tool_names에서 저희가 만든 두가지 툴들, Search tool과 TODO tool을 둘다 쓸 수 있도록 루프를 돌고 있습니다.

agent = ZeroShotAgent(llm_chain=llm_chain, allowed_tools=tool_names) 이 코드에서는 llm_chain 기반, 저희가 만든 두개의 툴 기반으로 ZeroShotAgent를 만든다는 것입니다.

그러고 다음 줄, agent_executor 에서는 이 agent를 실행한다는 코드입니다.

마지막으로 Part 2에서 만들었던 BabyAGI Controller 부분에서 아래 코드를 찾으세요.

class BabyAGI(Chain, BaseModel):
    """Controller model for the BabyAGI agent."""

    task_list: deque = Field(default_factory=deque)
    task_creation_chain: TaskCreationChain = Field(...)
    task_prioritization_chain: TaskPrioritizationChain = Field(...)
    execution_chain: ExecutionChain = Field(...)
    task_id_counter: int = Field(1)
    vectorstore: VectorStore = Field(init=False)
    max_iterations: Optional[int] = None

여기서도 저희가 처음에 만들었던 세번째 execution 체인 대신 새롭게 만든 구글 검색 기능 체인으로 대체해줘야합니다. 그래서 execution_chain: ExecutionChain = Field(...) 코드를 execution_chain: AgentExecutor = Field(...) 코드로 바꿔주세요.

그럼 아래 코드와 같이 생겼습니다.

class BabyAGI(Chain, BaseModel):
    """Controller model for the BabyAGI agent."""

    task_list: deque = Field(default_factory=deque)
    task_creation_chain: TaskCreationChain = Field(...)
    task_prioritization_chain: TaskPrioritizationChain = Field(...)
    execution_chain: AgentExecutor = Field(...)
    task_id_counter: int = Field(1)
    vectorstore: VectorStore = Field(init=False)
    max_iterations: Optional[int] = None

테스트해보기!

이제 실제로 구글 검색 기능이 되는지 테스트 해보겠습니다.

파일을 돌리기 위해서는 Part 1에서 만든 가상환경 안에 들어가 있어야합니다.

가상 환경 안에 들어와있다면 아래 사진처럼 뜹니다. 만약 들어와있지 않다면 터미널에서 source venv/bin/activate을 입력하고 엔터를 누르세요.

Screenshot 2023-08-21 at 4.32.23 PM.png다음 저희는 serpAPI를 쓰기 위해 다운로드해야하는 패키지가 있습니다. 터미널에 pip install google-search-results를 입력해주세요.

이제 python agent.py 를 입력하면 코드가 돌려집니다.

첫번째 결과값으로 오늘 서울의 날씨를 구글에서 검색을 했고, 결과값으로 ”오늘의 날씨는 화창하며 최저 기온은 16도, 최고 기온은 24도입니다. 바람은 약하고 대기질 지수가 낮습니다.”가 나왔습니다.

Screenshot 2023-08-21 at 4.35.36 PM.png두번째 태스크를 돌리면 8월달에 서울의 평균 기온이 -6도에서 30도 사이라는 결과값이 나왔는데, 별로 정확하진 않네요. 아무래도 hallucination이 발생한 것 같습니다.

Screenshot 2023-08-21 at 4.35.48 PM.png마지막 태스크로 서울의 현재 습도를 검색한 결곽로 83% 정도의 습도, extremely humid라는 결과값이 나왔습니다.

Screenshot 2023-08-21 at 4.35.59 PM.png

Part 3 마무리

이로써 Part 3가 마무리되었습니다!

SerpAPI에서는 구글 검색 뿐만 아니라 네이버 검색, 구글 지도, 유투브 검색 기능 등 정말 다양한 API를 제공하고 있으니 SerpAPI 사이트에서 documentation을 확인하면서 써보세요 :)

오늘 저희가 만들었던 agent와 같이 비슷한 구조로 만드시면 됩니다.

"Write a weather report for Seoul today”라는 프롬트 대신 “conduct Facebook market analysis”라는 프롬트도 해보면서 코드를 돌려보세요! 생각보다 재미있는 결과값들이 나옵니다. ㅎㅎ

오늘도 긴 글 읽어주셔서 감사합니다. 문제가 생기거나 코드가 잘 이해되지 않는 부분이 있으면 언제든지 포스트에 댓글로 달아주시거나 저한테 커피챗으로 연락주세요.

15
3
박예호

박예호

스타트업 축제 Try Everything 2023에서 3일간 부스 운영을 하게 되었습니다!

0003300133_001_20230811100101100.jpg

프로젝트 기반 실무형 대외활동 플랫폼 <클러비티>가

9월 13일부터 15일까지 총 3일간 동대문디자인플라자(DDP)에서 열리는 Try Everything 2023에서 오프라인 부스 운영을 하게 되었습니다!

수많은 창업 생태계 관계자 분들과 투자자 분들을 직접 뵐 수 있다는 생각에 가슴이 두근두근합니다🙌

디스콰이엇에서도 Try Everything 2023 참가 기업 있으시면 알려주세요!

당일에 얼굴 뵙고 인사 나눌 수 있으면 좋겠습니다🙂

클러비티

기업 프로젝트 연계 실무형 대외활동 플랫폼

6
0
심은광

심은광

오픈채팅봇으로 공부방을 만들어봤어요 :D

약 6개월간 모두CBT를 운영하면서,  서비스 발전에 큰 도움이 됐던 것중 하나가 오픈채팅방이었던 것 같아요.

오픈채팅방을 통해 유저들의 피드백을 수용하고, 소통했던게 정말 큰 도움이 됐던 것 같습니다.

오픈채팅방을 좀 더 발전 시켜보고 싶어서, 어떻게 하면 유저분들께 좀 더 특별한 경험을 제공해드릴 수 있을까 고민한 끝에 오픈채팅봇을 제작하게 됐습니다 !!

제가 운영하는 오픈채팅방은 기사시험을 준비하시는 분들이 모여서 정보 공유를 하는 방인데, 랜덤으로 문제를 내주고, 정답을 알려주는 봇이 있으면 유용하겠다는 생각이 들어서 바로 개발에 돌입해봤습니다 !!

현재는 단순하게 문제를 내주고, 정답을 알려주는 2가지 기능 밖에 없지만 이것저것 추가해서 더 발전시켜볼 계획입니다 !

생각보다 유저분들 반응이 너무 좋아서 뿌듯하고 재밌네요 ㅎㅎ

스크린샷 2023-08-21 오후 3.42.26.png

저처럼 오픈채팅방을 운영하시는 분이 계시다면, 커스텀 오픈채팅봇을 만들어서 활용해보시는 것을 추천드립니다 !! 

7
2
LIM

LIM

스타트업 인사 탐험기_ 인사팀은 언제 필요한가?

스타트업에서 인사팀 찾기_ 첫번째 이야기

많은 스타트업이 어둠 속에서 찰나의 순간에 빛을 내며 탄생한다.

하지만,

모든 사람들이 별의 탄생을 기억해주고 축복해 주지 않는 것처럼

스타트업 생태계에서 별의 탄생과 죽음이 매일매일 일어나는 곳도 없을 것이다. 

또한,

모든 것을 완벽하게 갖추고 출발하는 스타트업 또한 없다.

하루가 다르게 시장이 요동치며 변화하고, 

고객의 욕망이 날씨처럼 끊임없이 변화는 이곳 스타트업 행성은 

하루도 조용한 날이 없다.

그중에서 인사팀은 만난 다는 것은 "희망"을 보는 것이다. 

마치 사막에서 꽃이 피는 것처럼 말이다. 

"사막에도 꽃이 핀다. 아주 오랜 시간의 기다림과 비를 만난다면 기적처럼 사막에도 꽃이 핀다."

 2015년 9월 세상에서 가장 건조한 칠레 아타카마 사막에서 슈퍼 엘리뇨 현상으로 폭우를 만나 분홍색 당아욱 꽃밭이 사막에 만들어졌다.   

칠레_아타카마 사막 [사진_아타카마닷컴]

스타트업에서 [인사팀]이 만들어졌다는 이야기는 드디어 마지막 구슬이 꿰어지는 순간이기 때문이다. 

스타트업의 특성상 빠르게 시장에 진입하여 고객의 피드백을 실시간으로 받는 상황에서 조직을 생각하고 운영하는 측면은 생존 앞에서는 당연히 후 순위 일 수밖에 없다. 

그래서 

스타트업 채용공고에서 HR 채용공고를 보았다면 그 회사는 지금 성장 중인 회사일 것이다. 

 

그렇다고 [인사팀] 없이 회사를 운영한다는 것은 간단한 일이 아니다. 

그래서 회사의 규모와 비례하여 그 업무를 경영지원 혹은 총무 혹은 대표가 직접 HR 업무를 수행한다. 

그렇다면

스타트업에서 언제쯤 [인사팀]을 세팅하게 될까?

정답은 없다. 하지만 때는 있다. 

스타트업은 콤팩트한 규모에서 시장에 진입한다. [개발자][기획자][운영]등 기본 조직에서 

다양한 시행착오를 거치면서 채용과 인사업무에 대한 분업과 전문성을 가진 인력이 필요해지는 순간이 온다.

그때 [인사팀]이 등장하게 된다. 

왜냐하면 스타트업 초창기에는 분업할 만큼의 업무가 되지 않으며, 5명 있는 스타트업 조직에서 부서와 조직의 개념이 불명확하고, 개발하며 마케팅하고 기획하는 멀티플레어들에게 [인사팀]의 필요성이 크게 있지 않기 때문이다. 

하지만 규모가 커지면 커피 한잔하고, 밥 한번 먹으면 해결될 문제들이 더 이상 그 방법이 통하지 않게 된다. 규모에 비례한 문제들과 분업에 따른 전문성이 필요해지는 순간이 찾아오기 때문이다. 

그래서 스타트업에서 인사팀이 생겼다는 것은 희망이며
바로 성장하고 있다는 증거이다. 

6
3
Roy Kim

Roy Kim

새로운 AI 패러다임 생성형 검색 경험(SGE) 업데이트, 학습 경험을 더욱 풍부하게

세 달 전에 공개된 'AI 패러다임 검색 경험(SGE)'이 사용자들의 따뜻한 반응과 피드백을 바탕으로 미국시간 기준 8월 15일 구글에서는 다양한 업데이트를 선보였다.

구글 SGE 업데이트 화면 1.png

첫 번째로 주목할 업데이트는 'AI 응답 안에서의 정의 탐색'이다. 이제 사용자는 과학, 경제, 역사 등 다양한 주제에서 AI로 생성된 응답을 확인하면서, 알 수 없는 단어나 용어에 대한 정의와 이미지를 즉시 확인할 수 있다. 이 기능은 특히 새로운 주제나 어려운 개념 탐구 시 큰 도움이 될 것으로 예상된다.

또한, 프로그래밍을 공부하는 개발자들을 위한 '코딩 정보의 AI 개요' 기능도 도입됐다. 이를 통해 생성된 코드를 더욱 명확하게 이해하고 디버깅할 수 있게 되었다. 코드의 구문을 강조하여 사용자가 주요 요소를 빠르게 인식하고 분석할 수 있도록 돕는다.

구글 SGE 화면 업데이트 4.png

그 외에도, "SGE 브라우징 중"이라는 새로운 기능을 통해 사용자는 웹 탐색 시 핵심 포인트를 AI가 생성하여 리스트 형태로 제공받게 된다. 이 기능은 긴 기사나 내용에서 원하는 핵심 내용을 빠르게 찾는 데 큰 도움이 될 것으로 보인다.

단, "SGE 브라우징 중" 기능은 무료로 공개된 기사에만 사용 가능하며, 유료 콘텐츠에는 적용되지 않는다. 이에 대한 더 자세한 정보는 해당 서비스의 도움말 센터에서 확인할 수 있다.

이번 업데이트는 사용자의 학습 경험을 더욱 풍요롭게 만들기 위한 SGE의 지속적인 노력의 일환으로, 앞으로도 다양한 업데이트와 향상된 기능을 기대해 볼 수 있을 것이다.

8
0
한주현

한주현

광고 효율 200% 끌어올리는 소재 기획법 | 전환율 상승 TIP

광고 소재 전환율이 낮아서 고민이신가요?
고민을 시원하게 해결해 드릴 방법 알려드릴게요. 
A/B 테스트와 상세 페이지 카피 구상, 그대로만 따라해보세요. 😉

링크 클릭하고, 정보 얻어가세요. 🔍


원포인트는 탑티어 프리랜서 마케터 매칭 서비스로,
검증된 상위 10% 마케터를 필요한 만큼 고용하실 수 있는 서비스입니다.

원포인트가 궁금하다면? 📌

Thumbnail_Blog_marketing_material_2.png
7
0
윤현묵

윤현묵

[230821] 모두의연구소가 전하는 "모두를 위한 AI 뉴스"

안녕하세요~ 다들 주말 잘 보내셨나요 :)
오늘의 AI뉴스와 함께 한 주를 시작해 볼까요?

모두의연구소는 함께 공유하고 성장하는 국내 최대 AI 커뮤니티입니다🌱.
그럼, 오늘의 AI 뉴스 시작해 볼게요!

1️⃣DSDN: 텍스트-비디오 생성할 때 깜박임과 아티팩트 문제 해결법은 무엇?
최근 텍스트-비디오 생성에 대한 관심이 커지고 있지만, 현재 생성된 비디오에는 깜박임과 아티팩트 (비디오 품질 왜곡)문제가 여전히 존재하고 있습니다 이를 해결하기 위해 이 논문에서는 동영상 생성의 일관성을 향상시키기 위한 이중 스트림 Diffusion 모델(DSDN)을 소개합니다.
두 Diffusion 스트림, 비디오 콘텐츠와 모션 브랜치는 별도로 실행하며, 크로스 트랜스포머를 상호작용시켜 콘텐츠와 모션을 정렬합니다. 추가로 모션 디코더와 컴바이너가 도입되어 동영상 모션 작업이 간편해졌습니다. 실험 결과, 이 방법을 통해 깜박임 없이 고품질의 연속 동영상이 생성된 것을 확인할 수 있었습니다.

2️⃣TeCH: 미세 조정 텍스트-이미지 확산을 활용한 고품질 3D 인물 재구성
한 장의 이미지를 통해 옷을 입은 사람의 '보이지 않는 영역'을 재구성하는 연구는 디테일 복원 퀄리티를 높일 때 난관을 초래합니다. 이번 논문에서는 텍스트 기반, 3D인물을 재구성하여 보는 새로운 TeCH 방법을 소개합니다.
이 방법은 의복을 분석하고 시각적 질문 답변을 활용, 생성된 설명 텍스트 프롬프트와 미세 조정 Text-to-Image Diffusion 모델을 통해 3D 인물을 재구성하는 방법입니다.
이 논문에서는 더 나아가 DMTet 기반의 하이브리드 3D 표현을 통해 고해상도 3D 옷을 입은 사람을 재구성까지 하는데요, TeCH는 고품질의 3D 옷을 입은 인간을 생성했으며 이전 모델들보다 더욱 개선되었다고 합니다.

3️⃣DragNUWA: 텍스트, 이미지, 궤적을 활용한 세분화된 비디오 생성 모델
제어 가능한 비디오 생성 연구는 높은 관심을 받지만, 세밀한 제어 능력과 복잡한 궤적을 처리하는데 한계가 있습니다. 이런 한계를 극복하기 위해 요즘 연구진들은 DragNUWA라는 오픈 도메인 Diffuion 기반 비디오 생성 모델을 소개합니다.
이 모델은 텍스트, 이미지, 궤적 정보를 결합하여 영상 콘텐츠를 세분화시켜 제어하고 궤적 샘플러(TS), 멀티스케일 융합(MF), 적응형 훈련(AT) 전략을 통해 궤적 제어의 한계를 극복했습니다. 또한 여러 기법을 활용한 DragNUWA는 세분화된 비디오 생성 제어에서도 우수한 성능을 보였습니다.

📍Llama 2, SDXL 이미 알고 있다면?
AI학교 아이펠 리서치 과정 모집 중 → https://bit.ly/3OX29fF

6
0
김주영

김주영

요즘 나의 고민

  1. 장사의 수준은 넘었다. 그러나 사업의 수준으로 가기 위해선 무엇을 해야하는가?

  2. 사용자의 대부분이 Stereotype에 갇혀있다면, 우리는 그것을 깨부수어야 하는가 아니면, 그 Stereotype을 활용하여 우리에게 올 수 있도록 해야하는가?

  3. 타겟 광고를 통하여 인공적인 유입 자체는 늘렸다. 그러나 만약 전환이 없다면 무엇이 문제인 것일까? 2.로 돌아가서 그러한 Stereotype을 활용한다면 어떻게 Activation로 변화시킬까?

  4. 우리의 Hook는 무엇인가? (=더 쉽게 유입시키는 방법이 뭐지)

    한 줄 정리: RR은 되는데 AAR가 안된다. (인테리어라 Retention을 기대하기 어려운 것인가?)

11
5
준프

준프

리액트 Custom Hook과 Context API

지겨울 만도 하지만 다시 나타난 Custom Hook과 Context API에 관한 글 입니다. 하지만 그럼에도 좋은 글이라고 생각해서 공유 합니다. 왜냐하면 사랑에 대한 글과 문장은 많지만 울림을 주는 경우는 많지 않고 명문은 더욱 적은 것과 비슷하다고 할까요?

종종 설명을 하다보면 장황하게 설명할 때가 많은데요, 이 글은 Custom Hook과 Context API가 리액트 앱에서 어떤 역할을 하는지, 언제 사용하면 좋을지 아주 간결하고 명확하게 설명합니다.

Custom hooks are functions that allow you to extract and share stateful logic across multiple components. They allow you to encapsulate state and behavior in a reusable, modular, and testable way. The Context API, on the other hand, provides a way to pass data down the component tree without having to pass props down manually at every level.

그리고 장점과 단점도 명확하게 나열되어 있습니다. 그 중에 특히 단점이 눈에 들어왔습니다.

  • Complexity: While custom hooks and the Context API are very powerful, they can also add a layer of complexity to your code, making it more difficult to understand and maintain.

글이 길지 않기 때문에 읽기도 좋네요 :)

0
1
이정민

이정민

[Tip] 이커머스 고객 전환율 30% 높이는 방법, AI 상품 이미지 만들기 🛒

이미 225조원 (2023년 예상) 규모로 커져 버린 이커머스 시장,
수많은 제품에서 소비자의 관심을 끄는 요소에는 무엇이 있을까요?

coupang.png

출처: 쿠팡

소비자 5명 중 4명은 온라인에서 상품 구매 시 이미지를 참고한다고 합니다.

온라인에서 상품을 직접적으로 확인할 수 있는 유일한 방법이 이미지이기 때문인데요.

이커머스 중에서는 플랫폼의 직접적인 판매(직매입) 외에도 소상공인 셀러의 입점 판매(오픈마켓)도 있습니다.

물론 디스콰이엇이 창업자가 많은 곳이기는 하지만 일반적으로 사람들이 플랫폼을 창업하기 보다는 셀러로 입점하는 경우가 많을 것입니다. 다행히 다양한 참고 자료 또는 양질의 교육이 제공되고 있지만 '잘하는' 셀러로 거듭나기에는 어려운 점이 많습니다.

그 중 하나의 이유로 '소비자의 이목을 끄는 이미지의 부재' 일 것입니다.

기술이 많이 좋아졌다고는 하지만 사용 방법을 잘 모르는 소상공인에게는 일명 '누끼(배경 제거)', 그리고 배경, 구도 등의 설정을 통한 전문적인 상품 이미지 촬영이 어렵습니다.

그런 점에서 이미지 AI 기술은 소상공인에게도 기회를 줄 수 있습니다. 핸드폰으로 적당히 사진을 찍어도 괜찮은 이미지를 만들 수 있기 때문인데요.

해외에는 Booth.ai, Flair.ai, Pebblely, Claid.ai 등이 있으며(더 자세한 내용은 링크), 국내에서는 드랩, 파이온코퍼레이션 등이 해당 시장을 목표로 움직이고 있습니다.

(혹시 추가해야 할 기업은 알려주시면 수정하겠습니다)

오늘은 관련한 해외 프로덕트 중 Flair.ai 와 Pebblely 에 대해 살펴 보겠습니다.

(빨리 직접 코드로 만들어보고 싶은 분께서는 아래로 스크롤 해주세요)

1. 배경 제거

prev_after_can.png출처 : 스모어톡

별도의 편집 과정 전 가장 중요한 것은 상품의 이미지만 잘 남기는 것입니다.
그래야 배경 없이 상품만 깔끔하게 보여줄 수도, 차별화된 배경 이미지를 보여줄 수도 있기 때문입니다.

remove_flair.png

먼저 Flair 는 2단계에 나누어 배경 제거 및 해당 이미지 이름 지정을 진행합니다. 이는 물체 지정을 통해 텍스트를 통한 생성 시 사용자가 원하는 설정에 최적으로 생성하기 위함으로 보여집니다.

remove2_pebblely.png

반면 Pebblely 는 이미지를 올리는 순간 바로 배경을 제거합니다. 또한 물체 이름을 별도로 지정하지 않습니다. 따라서 한 번에 전 작업 과정을 수행해 간편하다는 인상을 줍니다.

2. 배경 이미지 생성

generate_flair_pebblely.png(좌) Flair, (우) Pebblely

두 서비스 모두 기본 템플릿과 커스텀 생성 모드를 제공합니다. 이는 사용자에게 이미지를 생성하는 과정 자체가, 그리고 장면에 대한 영감을 한 번에 떠올리기에는 어려움이 있음을 인지하고 있다고 해석됩니다. (다른 서비스이지만 플라멜도 이를 참고하고 있습니다.)

generate_flair.pnggenerate_pebblely.png

Flair 나 Pebblely 의 큰 차이점은 UI의 구성입니다. 두 서비스 모두 배경이 제거된 이미지를 사각형 안에서 자유롭게 배치할 수 있는 것은 동일하지만 결과 이미지를 제시하는 방법에서 다소 구별되는 모습입니다.

Flair 는 물체 이미지 바로 옆에 생기는 하나의 큰 이미지로 변화를 확인할 수 있다는 점에서, Pebblely 는 물체 이미지 하단에 여러 개의 작은 이미지를 한 번에 보여주어 비교를 할 수 있는 점이 특징입니다.

result_flair_pebblely.png(좌) Flair, (우) Pebblely

참고로 비용은,

Flair 의 경우 월 $10 로 무제한 생성이 가능하며,
Pebblely 의 경우 월 $19 로 1,000장 생성 또는 월 $39 로 무제한 생성이 가능합니다. (업스케일 기능이 추가적으로 있습니다)

그러면 여기서 확인할 수 있는 내용은 다음과 같습니다. ✅

  • 가벼운 편집 기능도 의미가 있다 (배경 제거만 잘해도 상품 이미지 반 이상은 간다)

  • 사용자들에게 생성 이미지 서비스는 아직 어렵다 (팀의 템플릿 콘텐츠가 중요하다)

  • UI 로 사용자가 받는 인상이 달라진다 (물론 결과물에 영향을 주는 생성 모델도 중요하다)

  • 비용이 꽤 많이 차이가 난다 (그래서 지불 의향도에 변화가 생긴다)

그렇다면 직접 만들어 볼 수는 없을까요? 🤔(핵심이죠?)

간단히 설명을 드리겠습니다.

해당 방법은 Meta 에서 공개한 SAM (객체 인식 및 마스킹 이미지 생성) 과 Stable Diffusion 의 인페인팅 (마스킹 영역에서 이미지를 새로이 생성) 기능을 활용합니다.

  1. 상품 이미지를 준비한다.

    • 아무거나 상품을 찍은 이미지 한 장을 준비합니다.

      cocacola_can.png

  2. 구글 코랩 (GPU) 을 연다.

    • SAM 과 Stable Diffusion 을 사용하기 위해선 GPU 가 필요합니다.

    • 코랩은 연구/학습용으로 구글이 제공하는 클라우드 기반 Jupyter Notebook 환경입니다. 무료로도 사용 가능합니다. (다만 V100 이상 부터 사용이 원활합니다)

    • 다음 코드를 입력해주세요.

  1. SAM을 사용해서 마스킹 이미지를 만든다.

구글 드라이브 연결 (승인 버튼 클릭 필요)

from google.colab import drive
drive.mount('/content/drive')

필요한 라이브러리 설치

!pip install -q transformers

SAM을 GPU에 올리기

import torch
import torchvision.transforms as transforms
from PIL import Image
import cv2
import requests
from transformers import SamModel, SamProcessor
import numpy as np
import matplotlib.pyplot as plt

device = "cuda" if torch.cuda.is_available() else "cpu"
model = SamModel.from_pretrained("facebook/sam-vit-large").to(device) #Inference SAM
processor = SamProcessor.from_pretrained("facebook/sam-vit-large") 

facebook의 github repo clone 을 통한 방법도 있지만, 저는 hugging face 의 transformers 라이브러리를 사용했습니다.

이미지 열기 (name_what_you_want 수정 필요)

home_path = "/content/drive/MyDrive"
filename =  "/{name_what_you_want}"
format = ".png"
image_path = home_path + filename + format
image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

fig, axes = plt.subplots(1, 1, figsize=(15, 15))
axes.imshow(np.array(image))
axes.axis("off")
plt.show()

cocacola_can_1.png

사물 지정하기

h1, w1 = image.shape[:2] 
input_points = [[[int(w1/2), int(h1/2)]]] #take center point for the target

SAM을 사용해 사물 인식하기

inputs = processor(image, input_points=input_points, return_tensors="pt").to(device)

with torch.no_grad():
    outputs = model(**inputs)

masks = processor.image_processor.post_process_masks(outputs.pred_masks.cpu(), inputs["original_sizes"].cpu(), inputs["reshaped_input_sizes"].cpu(), mask_threshold=0.2) #default of mask_threshold = 0.0
scores = outputs.iou_scores

마스킹 결과 확인하기

def show_mask(mask, ax, random_color=False):
    if random_color:
        color = np.concatenate([np.random.random(3), np.array([0.6])], axis=0)
    else:
        color = np.array([30/255, 144/255, 255/255, 0.6]) #normalize
    h, w = mask.shape[-2:]
    mask_image = mask.reshape(h, w, 1) * color.reshape(1, 1, -1)
    ax.imshow(mask_image)

def show_masks_on_image(raw_image, masks, scores):
    if len(masks.shape) == 4:
      masks = masks.squeeze()
    if scores.shape[0] == 1:
      scores = scores.squeeze()

    max_score = torch.argmax(scores)
    fig, axes = plt.subplots(1, 1, figsize=(15, 15))

    mask = masks[max_score].detach().cpu().numpy()
    axes.imshow(np.array(raw_image))
    show_mask(mask, axes)
    axes.axis("off")
    plt.show()

# Show with Masked Image
show_masks_on_image(image, masks[0], scores)

cocacola_can_2.png

마스킹 이미지 만들기

max_iou_score_index = torch.argmax(scores).detach().cpu().numpy() #iou=Area_of_overlap/Area_of_Union
mask_boolean = masks[0].squeeze()[max_iou_score_index] #Take boolean tensor with maximum iou score

mask_img = ~mask_boolean.detach().cpu().numpy().squeeze() #Convert tensor to numpy #Get a Mask of Background

Image.frombytes(mode='1', size=mask_img.shape[::-1], data=np.packbits(mask_img, axis=1))

cocacola_can_3.png

마스킹 이미지 저장하기 (name_what_you_want 수정 필요)

cocacola_mask = Image.frombytes(mode='1', size=mask_img.shape[::-1], data=np.packbits(mask_img, axis=1))
mask_image_path = home_path + "/{name_what_you_want}" + format
cocacola_mask.save(mask_image_path,"png")

이렇게 마스킹 이미지를 생성했습니다. 그러면 배경 이미지를 만들어봐야겠죠?

  1. Stable Diffusion을 사용해서 배경 이미지를 만든다.

필요한 라이브러리 설치

!pip install diffusers

스테이블 디퓨전 (SDXL) 세팅 (Refiner 는 설정하지 마세요)

from diffusers import StableDiffusionXLInpaintPipeline
from diffusers.utils import load_image

pipe = StableDiffusionXLInpaintPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16,
    variant="fp16",
    use_safetensors=True,
)
pipe.to("cuda")

배경 이미지 생성하기

img_url = image_path
mask_url = mask_image_path

init_image = load_image(img_url).convert("RGB")
mask_image = load_image(mask_url).convert("RGB")

prompt = "watercolor splatter"
negative_prompt = "ugly, deformed, noisy, blurry, distorted, grainy, text, cropped"
generator = torch.Generator("cuda").manual_seed(2023)
generated_image = pipe(
    prompt=prompt, negative_prompt=negative_prompt, image=init_image, mask_image=mask_image, generator=generator, num_inference_steps=50, strength=0.9
).images[0]

generated_image

의 과정을 거치면 나오는 이미지들은 다음과 같습니다,

짜잔 🌟

cocacola_can_4.png나름 만족하는 편...

타 서비스를 사용하는 것과 비교해 아쉬운 점은 두 가지입니다.

  • 다소 떨어지는 객체 인식 정확도 (SAM 보다 나은 모델이 있습니다, 스모어톡 또한 별도로 훨씬 배경이 잘 제거가 되는 모델을 가지고 있습니다)

  • 아웃페인팅 방식이 생성 이미지 퀄리티는 좋아 보인다 (대신 이미지가 깨질 것으로 보여 방법을 달리 해야 한다)

같이 고민해보고 싶은 분들 또는 서비스하고 싶은데 AI 모델 관련 협업이 필요하시면 연락주세요!

저번 AI 아바타에 이어 AI 상품 이미지 까지 직접 만들어 볼 수 있는 방법에 대해 정리해 보았습니다. 계속해서 이미지 AI 와 관련해 재밌는 이야기, 그리고 기술적인 내용도 한 번씩 다루어 보겠습니다 ㅎㅎ


이정민 (스모어톡, tonylee@smoretalk.io)

p.s. 상품 이미지 썸네일 관련 팁

p.s. 마케팅 관점에서 상품 이미지의 중요성

13
3
여기있산

여기있산

06. <도전> 여기있산의 새로운 도전

여기있산 ... ing

앞선 5개의 에피소드를 통해 소개드린 것처럼, 오랜 시간의 기획, 개발, 마케팅 과정을 거쳐 여기있산을 세상에 선보인 후, 2번의 개선을 통해 유의미한 지표를 확인하였습니다. 특히 등력테스트는 다양한 등산 오픈 카톡방에 바이럴 되면서 많은 등산객들의 호응도 얻었습니다. PM이 되기 위해 모였던 5명이서 이뤄낸 값진 결과였습니다. 이제는 이러한 결과를 바탕으로, 앞으로 무엇을 해야할지 결정해야 했습니다.

즉, 지금까지는 여기있산을 세상에 선보이기 위한 과정이었다면, 이제는 여기있산의 미래를 결정해야 하는 순간이 온 것이었습니다. 약 2.5개월 간의 스프린트를 경험한 저희는 당시 지쳐있었고, 프로덕트의 미래보다는 지금까지의 프로젝트를 잘 마무리하고 싶은 마음이 컸습니다. 그 순간, 저희에게 새로운 변화의 순간이 찾아왔습니다. 프로젝트 막바지, 여기있산이 활용한 데이터를 공급하는 산림청에서 주관하는 창업경진대회에 반신반의하는 마음으로 지원을 했었고, 모두의 예상을 뒤엎고 1차에 합격을 덜컥(?) 해버린 것이었습니다!

스크린샷 2023-08-21 오전 1.01.28.png

어쩌다보니 3차 개선

예상치 못한 합격이라 하더라도, 대충 참여할 저희 팀이 아니었습니다. 2차 발표까지는 약 3주간의 시간이 남아있었기 때문에, 평가기준에 맞게 한번더 개선을 진행하기로 결정했고, 빠르게 평가기준 별로 가능한 개선안을 도출하였습니다. 이미 유저의 니즈를 심도있게 분석하여 제작한 프로덕트였기 때문에 새로운 기능을 추가해야 할 필요는 없었습니다. 여기있산이 이미 갖고 있는 장점은 정교하게 보완하고, 심사위원들의 마음을 사로잡을만한 '킬러컨텐츠'를 추가하는 방향으로 개선을 진행하였습니다. 저희 팀이 늘 해오던 대로, 각 개선안 별 업무를 빠르게 분배하여 개선을 진행하였고,

그 결과

1) 전국의 등산로 데이터, 무장애 숲길 데이터가 추가되어 등산코스 데이터가 풍부해졌고

2) 유저 및 코스의 등산레벨 산정 로직은 더욱 정교해졌으며

3) 고도화된 등산코스 추천을 위해 새로운 킬러컨텐츠 '여기있산 AI'가 등장했습니다.

image.png

7월 내내 개선을 진행한 후, 8월에 빠르게 발표를 준비하여 여의도에 있는 산림비전센터에서 2차 발표를 진행하였습니다.

여기있산, 사고치다!

3차 개선과 발표를 준비하는 모든 과정동안, 팀원 모두가 헛된 희망을 품기보단, 여기있산이 가진 장점에 집중하고, 목표 달성을 위해 중요한 것에만 집중하였습니다. 평가기준 별 배점을 보고 중요한 개선안에 리소스를 더욱 투입하고, 발표자료도 기존의 자료를 최대한 활용하고 보완하였습니다. 즉, 돌아보니 여기있산을 만드는 모든 과정동안, 유저 혹은 심사위원이라는 목표를 설정하고 우선순위에 따라 모든 의사결정을 진행하였습니다. 명확한 목표를 수립하고 이를 팀원 모두가 공유하니, 의사결정과 리소스 배분이 빠르게 진행되었고, 이를 완성하는 과정에서 흔들림이 없었습니다.

그 결과 저희는 결국 ... !

image.png

이젠 저희도 저희가 조금 무서워요 ... 여기있산의 여정이 언제까지 지속될지 모르겠지만 모든 과정이 배움의 연속이었기 때문에 우선 저희는 이 길을 조금더 걸어보려 합니다. 여기있산 앞으로의 여정에도 함께해주세요!

여기있산

등산코스 추천 서비스

11
3
Learning by Doing

Learning by Doing

[2023년 8월 3주차 회고] 중요한 것 외에는 챙기지 않는다는 말

* 중요한 것 외에는 챙기지 않는다는 말

회사에서 홈페이지 개편을 하고자 합니다. 이 업무를 A팀에서 하기로 진행하였고 A팀 팀장은 그 동안 홈페이지 개편 때 했던 일들을 모아서 확인해봅니다. 과거 진행했던 일들을 모아보니 중요해 보이는 것들만 팀원들에게 업무를 분배하여 진행합니다. 

위 업무의 마무리는 어떻게 되었을까요? 

팀원들은 팀장이 시키는대로 업무를 진행하던 중 유관부서로부터 x, y, z는 왜 안챙기고 있는지 듣습니다. 그 사실을 몰랐던 팀원들은 정해진 일정 내에 황급히 x, y, z를 챙기기 시작합니다. 유관부서에서는 급작스런 요청 때문에 고생 고생하며 어쨌던간 업무를 마무리 합니다. 팀장은 고생한 팀원들에게 중요한 것이 아닌데 다른 부서에서 비효율적으로 일한다고 이야기합니다.

사례는 다르지만 놀랍게도 제가 다녔던 모든 회사에서 있었던 일입니다.


왜 이러한 일들이 반복될까요?

회사에서 일하다보면 선택과 집중을 위해 중요한 것 외에는 잘 챙기지 않는다고 말하는 사람들을 종종 만날 수 있습니다. 리더일수록, 고인물일수록 이런 말을 자주합니다. 비효율적, 시간 절약을 위해 등등 여러 가지 이유를 통해 중요한 것만 챙기자고 합니다. 어떤 분들은 이러한 말을 선택과 집중을 잘한다는 것의 다른 표현으로 자랑처럼 말합니다. 이러한 분들과 일할 때마다 항상 선택과 집중을 하는 것이 좋은 것인지 고민을 하게 됩니다.

중요한 것 외에는 챙기지 않는다는 말 속에 중요하다는 것은 누구 기준으로 생각해야까요? 중요하지 않다는 말의 의미는 무엇일까요?

많은 업무 중에 우선순위를 정하기 위해 선택과 집중을 한다는 것은 중요합니다. 하지만 진행하기로 한 업무 프로세스 안에서 선택과 집중을 하겠다는 것은 결국 내가 하고 싶은 일만 하겠다는 것과 같은 말입니다. 그 빈 공간은 누가 채워야 할까요? 업무 프로세스란 단순히 한 두 번으로 만들어진 것이 아닌 실무자들이 고민하고 실제 그 일을 하면서 필요한 것들의 플로우이기 때문입니다. 그렇기 때문에 단순히 내가 보기에 혹은 충분히 관련 실무자들의 이야기 듣지 않고 중요한 부분만 실무자들에게 전달한다면 실무자들에게 혼란에 빠질 수 있습니다.

보통 리더들과 이야기 나누면 실무를 챙길 시간이 없어서, 마이크로매니징을 한다는 이야기를 들을까봐 본인은 중요한 것만 챙긴다고 이야기 합니다. 그 중요한 것이 업무의 우선순위인 것이지, 유관부서와 합의되지 않은 프로세스의 변화는 아닙니다. 내 팀원의 일을 줄여서 팀원 평가는 좋을 수 있겠지만 충분한 합의 없이 중요한 것만 이야기한다면 팀원에 대한 유관부서 평가는 깎는 것입니다.

리더일수록, 고인물일수록 하기로 한 업무에 대해 중요한 것과 중요하지 않는 것을 구분하지 말고 전체 프로세스에 집중해 실무자들과 이야기를 나누고 진행해야 실무자들이 혼란없이 일할 수 있습니다. 전체 프로세스를 보고 정말 비효율적인 일이 있다면 회고를 통해 이야기를 나누고 정리하면 됩니다.  현재 리더라면 한 번쯤 고민해보면 좋을 것 같습니다.

 

5
0
맨듀

맨듀

작년에 디스콰이엇을 알게 되었고 아마 그때도 지금처럼 뭔가 이것저것 해보고 싶었던 것 같습니다. 정신 없는 날들을 보내다가 오랜만에 디스콰이엇에 접속해서 많은 분들의 글을 보다가 제 프로필을 보는데 제가 쓴 글이 있더라구요?

2022년 7월의 글이고 그 때는 지금 다니던 회사에 입사 한 지 한 달도 되지 않았고 서비스 운영,기획 뭐든 배우면서 이 기회를 발판으로 삼아 더 나아갈 수 있겠다! 생각하며 썼겠구나 싶은게 글에서 밝음이 느껴졌습니다.

글의 말미에 스파르타 코딩클럽 창업 부트캠프를 참여를 고민중이라고 썼던데 정말 놀랍게도 이번에 창업 부트캠프를 신청했고 다음달에 본 과정을 시작합니다. 정말 참여할까 말까 고심했었는데 글로 남겨둔지도 몰랐네요.

서비스운영에 대해 많이 배울거라 생각했는데 분명 배웠겠지만, 배웠다는 생각보다 갉아먹히고 있다는 생각이 더 큽니다. 일년전 작성한 글과는 반대의 길을 걷고 있어요.

서비스의 범위는 방대하고 그 업무중 전부이자 일부를, 일부이자 전부를 맡고 있는데 앞으로 나아질 기미는 보이지 않고 대체 여기는 어떤 서비스를 추구하고 있는건지 의문이 들기 시작했어요.

퇴사를 하는게 맞는 것 같은데 왜 이렇게 말을 꺼내기가 두려울까 생각하다 문득 디스콰이엇이 생각났습니다. 퇴사할 힘(?)을 얻을 수 있을 것 같기도 하고 에너지 넘치고 뜨거운 분들의 글을 보면 힘이 날 것 같아서요.

그렇게 힘을 얻어 이 글을 작성하고 있습니다. 저는 앞으로 어떤 서비스를 할 수 있을까요? 너무 타인만 생각하고 지낸건 아닌지, 오늘부터 제 스스로를 생각해보려고 합니다. 어느 누구도 아닌 나로부터 시작되는 서비스를! 모두들 화이팅 입니다.

8
3
류대현

류대현

프로젝트의 컴포넌트화/모듈화 리팩토링 경험

프로젝트를 확장한 뒤에, 유지보수를 하면서 고민했던 경험을 정리해보려고 합니다.

프로젝트 참여와 확장

media_teamsolution_promotion.jpg(TeamSolution 프로모션 이미지, 출처 : 3SECONDZ)

제가 참여할 2019년 말 당시에는, TeamSolution 프로젝트는 최대 5인으로 구성된 팀 단위 운용을 기준으로 한 실시간 텔레메트리 관제 서비스로 개발이 진행되고 있었습니다.

어느 정도 서비스를 위한 동작 기반이 구축되어있었고, 저는 참여 초반에 프로젝트 구조 파악과, 완료되지 않은 CSS 스타일링 작업 (특히 반응형 레이아웃)을 진행하였습니다.

첫번째 확장, RaceSolution

그렇게 프로젝트 알고리즘을 파악하며 작업하던 중, 경기 관제를 위해 TeamSolution 프로젝트를 확장하여 RaceSolution이라는 솔루션을 개발, 국내 모터스포츠 경기 SUPERRACE에 서비스하게 됩니다.

처음 5인 관제 시스템에서, 20여 명이 참가하는 SUPERRACE에 대응하기 위해 기존 알고리즘에서 분기하는 방식으로 코드 파일을 복제하여 경기를 위한 알고리즘을 덧대어 구성하기 시작했습니다.

두번째 확장, SolutionMaster

이후에 좀 더 관리 기능을 강화하고, 전반적인 기능을 개선한 R&D 및 기관용 솔루션 SolutionMaster를 개발하게 되었습니다.

이 때 역시 RaceSolution 알고리즘 코드에서 분기하는 방식으로 코드 파일을 복제하여 알고리즘을 추가하여 개발을 진행하였습니다.

예정된 문제들

다들 그렇듯, 촉박한 시간 내에 프로젝트 런칭을 해야 하는 상황에 놓인 것은 같았지만, 일단 작업 해놓고 리팩토링을 하자는 생각으로 진행했었습니다. 그러나 현실은 시간에 쫒겨 새로운 프로젝트, 그 다음 새로운 프로젝트, 또 다른 프로젝트가 연속되는 상황에 리팩토링은 쉽지 않았습니다.

분기 되었던 서로 다른 서비스 코드 내에서 동일한 알고리즘을 가진 코드를 수동으로 직접 수정하며 발생하는 에러와 사이드 이펙트 몇 가지 이슈를 추려보면 다음과 같습니다.

  • 복제된 알고리즘 코드에 퍼져있는 동일한 서비스 코드들

  • 분기된 뒤에, 동일 코드였던 것들이 각 서비스 별로 변형된 코드에 적용되며 사이드 이펙트 발생

  • 일관적이지 않은 유사 컴포넌트의 인터렉션 알고리즘 코드

  • 단순 오타, 누락 등으로 인한 휴먼 에러

  • 기타 유지보수 상에 발생한 이슈

리팩토링을 위한 설계, 그리고...

모듈화 설계.png(Figma로 정리한 설계 정보와 PT 자료)

첫번째 확장 이후, 운영 중 발생한 여러 이슈들로 인해 개발팀 내부에서 모듈화 필요성에 대한 공감이 있었고, 개인적인 코드 개선 욕심도 있었습니다.

그래서 당시 시점까지 개발된 모든 서비스 코드와 알고리즘을 분석하여, 솔루션에 공통적으로 활용하는 components 파트와 core 알고리즘 파트, 그리고 솔루션 별로 각각 사용되는 components 파트와 optional 알고리즘 파트를 구분하여 관리할 수 있게 설계를 마쳤고, 틈틈이 개발팀 내부에 PT하며 진행 상황을 공유하였습니다.

프로젝트 스케쥴이 다소 여유로웠던 겨울에 작업을 실제로 진행하였으나, 항상 우선순위에서 밀려서 겨울에 1~2개월 정도 진행을 하였습니다.

도중에 진행했던 Lap VS Lap에서, 설계해두었던 컴포넌트/모듈화 코드를 처음 적용해서 서비스 런칭까지 하였습니다.

2022년 겨울에 드디어 메인 서비스인 TeamSolution, SolutionMaster의 모듈화 작업에 꽤 진전이 있었으나 내부 사정으로 결국 모듈화 작업을 마무리짓지 못했습니다.

느낀 점

우선, 처음부터 재사용 코드에 대한 고민을 좀 더 신경쓰게 되었습니다. "나중에 해야지" 방법은, 그 "나중"이 영원히 오지 못할 수도 있다는 것을 깨달았고, 처음에 요구사항에서 최대한 재사용성과 확장성을 고려하게 되었습니다.

그리고 설계 내용에 대한 피드백으로 들었던 것이, EJS로 이렇게까지 활용할 수 있으면 리액트를 사용해보는게 좋겠다였습니다. 안그래도 리액트 활용에 대한 갈망이 있어서 주말에 혼자 간단하게 공부하고 있던 중에, 피드백을 듣고 좀 더 적극적으로 활용하게 되었습니다.

저 피드백 이후, 2022년 말에는 메인 서비스 이외의 프로젝트에서 Vite를 이용한 가상 DOM의 운용, 리액트로 자사 홈페이지 리뉴얼 프로젝트까지 실무에서 활용했었습니다.

Vite환경에서 가상DOM을 활용한 것은 HL Klemove 납품을 위한 시각화 대시보드 프로젝트였습니다.

또한 Vite + React를 활용한 홈페이지 리뉴얼 프로젝트는 컴포넌트와 인터렉션까지 진행되었으나 스타일링 단계에서 내부 사정으로 중단되어 개인적으로 많이 아쉬웠습니다.

TeamSolution

3SECONDZ에서 런칭한 실시간 주행 관제 솔루션

3
0
Hongbeom

Hongbeom

초기 창업가를 위한 개발 파트너. 밸러 스투디오를 론칭했어요 🥷

지난달 정말 뛰어난 개발자 친구와 함께 valor.sh 개발 에이전시를 시작했습니다. 초기 창업자분들과 제품 및 개발 파트너로 함께하고 싶어요. 신제품 개발에 도움이 필요하신 분은 언제든지 연락 주세요!

초기 창업자, 마케터, 아이디어 뱅크분들 모두 환영합니다 : )

4
3
삼태현

삼태현

다시는 이렇게 안 합니다. 1인 스타트업에서 팀원 9명 모으고 후회하는 4가지

3주간의 네이버 AI 엠버서더 프로젝트를 마치고

Frame 17.png

안녕하세요 퓨처플로우 삼태현입니다.

네이버 AI RUSH를 지원하기 위한 3주간의 여정이 벌써 마무리되었습니다.

지난 3주를 돌아보면서 제가 느낀 점과 배운 점을 영상에 담아보았습니다.

프리랜서였던 제게 팀원들과 함께 스타트업을 운영하는 여정은 항상 실패하고 방향을 잃는 것에 연속이었습니다. 그러한 경험에서 항상 배우면서 저는 앞으로도 계속 실패하려고 합니다.

저희 팀의 여정을 공유함으로써 각자의 도전을 하고 있는 모든 분들에게 도움이 되었으면 합니다.

창업 초기에 무리하게 팀의 크기를 늘렸다.

Sequence 01.00_00_49_15.Still006.jpeg

지난달 퓨처플로우는 더 이상 저 혼자서 운영할 수 없는 크기에 도달했습니다.

AI 자동화에 대한 관심으로 수도 없이 많은 고객 문의가 쏟아졌죠. 감사하면서도 인력의 한계로 클라이언트를 놓치는 것이 너무 아쉬웠습니다. 이제는 팀을 확장해야겠다는 생각 했죠.

그러다 마침 네이버 AI 엠버서더 모집 공고를 보게 되었고 이 프로젝트를 진행하며 핏이 맞는 팀원을 찾으려 했습니다.

유튜브에 팀원 모집 공고를 올리고 생각지도 못하게 많은 관심을 받아 총 40분의 지원자들과 인터뷰를 진행했습니다. 몸은 힘들었지만 그만큼 다양한 강점을 가진 팀원들을 모을 수 있었습니다.

욕심을 부려 맞지 않는 옷을 입으려 했다.

Sequence 01.00_08_11_17.Still008.jpeg

그렇게 잘 풀릴 것만 같았던 팀이었지만 시작과 동시에 3명의 팀원이 이탈했습니다. 멋진 박사님들과 함께하고 싶었지만 저의 욕심이었어요.

뛰어나신 분들이지만 현재 퓨처플로우의 모습과 핏이 맞지 않았습니다.

그리고 그건 오롯이 팀을 빌딩한 저의 잘못이었죠.

앞으로 모든 일이 잘될 줄 알았다.

Sequence 01.00_13_32_12.Still009.jpeg

세분이 나가고 남은 6명은 더 단단해졌어요. 저는 이들에게 정말 좋은 경험을 주고 싶었습니다. 투자자 분들과의 만남에도 함께 가고 다른 임원분들의 미팅 때도 무리해서 부탁드리며 전부 함께 했어요.

이렇게 좋은 분위기에 휩쓸려 판단력이 흐려졌습니다.

아직 퓨처플로우에 랜딩 되지 않은 팀원들과 실제 프로젝트를 진행할 생각을 했으니까요.

그 당시 제 생각에는 돈을 받는 비즈니스를 가져오면 두 가지 이점이 있었습니다.   

  • 네이버 AI 엠버서더에 선정될 확률이 올라갈 것이다.

  • 열정페이 사이드 프로젝트가 아닌 수익을 나눌 수 있으니 사기가 올라갈 것이다.

처음에는 모두 한마음으로 동의하고 달리기 시작했지만 점점 균열이 일어났습니다.

팀원들과 가치를 공유하지 못했다.

Sequence 01.00_20_49_03.Still010.jpeg

변명을 하자면 미팅이 너무 많았습니다. 많은 날은 하루에 세 번 미팅이 있었어요. 자주 자리를 비우게 됐고 대화할 기회가 적었습니다.

그렇게 저를 믿고 따라온 팀원들은 영문도 모른 채 비즈니스 상황에 돌입했고 과도한 업무량에 지쳐가는 모습을 인지했습니다. 이건 좀 힘들더라고요.

지금 와서 생각해 보면 팀원들이 원했던 것은

  • 저기에 지원해서 태현님이 어떻게 하는지 배우고 함께 하면 좋을 것 같다.

  • 내가 해보지 않던 것들과 GPT 이외의 AI들을 배우고 혹은 GPT도 더 잘하게 되지 않을까

팀원들은 그랬겠지만 실제 업무로 돌입했을 땐 실험을 할 여유가 없었어요.

자신이 지금 당장 할 수 있는 역량을 최대한 이끌어내야 했죠. 저는 사업 확장에 빠져 구성원의 니즈를 읽는 것에 완전히 실패했고 모두 지쳐갔습니다.

동기부여를 하지 못했다.

Sequence 01.00_25_52_25.Still011.jpeg

결과적으로 3주 동안은 실패도 성공도 아닌 측정할 수 없는 결과를 맞이했습니다.

우리가 처음에 찍은 인터뷰 영상이 있습니다. 팀원들의 이런 부푼 마음을 저는 지켜내지 못했습니다.

이제 퓨처플로우의 확장 이전에 하나의 목표가 생긴 거예요. 팀원의 꿈을 이뤄줄 수 있는 사람이 되어야겠다.

이번엔 제가 너무 미성숙했지만 앞으로 관계를 이어나가며 최선을 다해야겠구나.

그럼에도 다시 일어나서 달려야 한다.

Sequence 01.00_17_35_21.Still012.jpeg

  • 시스템이 없는 상태에서 팀을 확장하지 않는다.

  • 욕심부리지 말고 맞는 옷만 입는다.

  • 항상 잘될 순 없다. 안 됐을 때 대비책을 세우자.

  • 팀원들과 끊임없이 소통하며 동기를 부여한다.

그리고 퓨처플로우는 이제 시작입니다. 지금 당장은 밤잠을 설칠 정도로 부끄럽지만 말씀드린 모든 걸 뜯어고치고 성장할 겁니다.

사실 가장 아팠던 피드백은 한 팀원에게 들은 “퓨처플로우는 비전이 없다.”였습니다. 그걸로 많은 생각을 하게 되었고 지금의 정답을 이제는 내릴 수 있습니다.

앞으로도 비전이 없는 팀으로서 존재하기로요.

저 역시 이전에 수없이 꿈만 꾸다가 쓰러진 몽상가로서, 수많은 비저너리들이 쓰러지는 걸 본 관전자로서 비전은 크게 중요하지 않다는 걸 깨달았어요.

세상을 바꾸겠다. 어떠한 사회 문제를 해결하겠다 같은 허무맹랑한 소리는 하지 않습니다. 이상과 비전은 머리로만 생각하고 당장은 현실에 발을 딛고 움직이려 합니다.

제가 해결해야 할 문제는 저 멀리 있는 사회의 문제가 아닙니다. 제가 해결해야 할 건 우리 가족이 겪고 있는 문제고 저를 믿고 계약한 클라이언트가 가진 문제들이니까요.

그들과 약속했고 제 몸을 갈아서라도 그들에게 행복을 선물할 겁니다. 퓨처플로우를 증명할 겁니다.

그게 퓨처플로우의 궁극적인 비전이고 “그만 찾고 실행하는 것” 그 자체가 제가 만들어갈 우리 회사의 DNA니까요.

모두 3주 동안 부족한 리더와 함께해 줘서 감사했습니다.

앞으로도 다양한 프로젝트를 해봅시다!

그때는 더 나아진 모습으로 여러분을 섬길게요.

  • 잠재 고객 쓸어 담는 마케팅 자동화 컨설팅 예약하기

 https://walla.my/survey/bHCzlgPKnR9N9mIJkodA

온라인 컨설팅을 통해 기존의 문제점을 파악합니다. 그 데이터를 바탕으로 잠재 고객 확보하는 마케팅 서비스를 제공합니다. 만약 저희와의 협업이 진행되지 않을 경우 100% 환불해 드리겠습니다.

[상상을 비즈니스로 구현하는 퓨처플로우 AI 자동화 에이전시]

[https://www.futureflow.tech/]

  • 퓨처플로우 뉴스레터   

https://www.futureflow.tech/subscribe

다양한 기업 및 공기관에서 AAA를 운영하며 얻은 교훈, 비즈니스 아이디어, 단계별 구현 전략 등 뉴스레터를 발행합니다.

AI 챗봇 레퍼런스 라이브러리에 접근할 수 있는 권한을 드립니다.

  • 링크

인스타 : [https://www.instagram.com/2taehn]

브런치 : [https://brunch.co.kr/@31ef4a61fc4447c]

삼태현 포트폴리오 : [https://3taehn.framer.website]

6
0
세블스

세블스

사이드프로젝트 파밀리아의 시작

아버지와 아들 

부모님 효도 구독 플랫폼 파밀리아를 시작하게 된 계기와 이유에 관한 이야기이다.

우리 아버지는 70대로 부산과 인접한 양산시에서 혼자 살고 계신다. 연세에 비해 건강하시고 혼자 살고 계신지 오래되서 모든 것을 혼자 해결하신다. 그리고 주말마다 교회에서 가서 사람들과 어울리신다. 

필자는 수도권에서 거주하며, 가정이 있다. 부모님을 모시고 사는 문제는 아들인 나 혼자 결정할 수 있는 사항이 아니다보니 쉽지 않다. 그럼에도 올라오셔서 같이 살자고 해도 싫다고 하시고, 같이 살지 않더라도 집 근처에 사시면 좋겠다 얘기해도 지금 살고 있는 터전을 떠나기 싫다고 하신다. 

이런 경우가 꽤 많지 않을까 생각한다. 대한민국의 가구 유형 중 가장 많은 경우가 1인가구로  2021년 기준으로 전체 대비 비율은 33.4%이며, 2035년에는 39.3%, 2045년에는 45.9%에 달할 것이라는 통계 자료가 있는데 문제는 1인가구 증가 속도가 예상치보다 빠르다는 것이다. 

1인가구의 증가, 고령 인구의 급속한 증가로 인해 독거 노인의 수도 급격히 증가하고 있어, 나와 같은 케이스가 아주 많을 것이다. 빈곤하지 않아도 나이들어 혼자 살면 독거 노인이다.

주변에 나와 비슷한 경우를 흔하게 볼 수 있다. 일례로 파밀리아 초기 팀빌딩 시 함께 했던 개발자의 경우는 나와 상황이 반대였다. 아버지가 혼자 서울에 사시고 아들인 개발자는 직장이 경남 거제라 아버지와 아들이 떨어져 살았고, 파밀리아 기획안으로 팀빌딩하는 모임에서 시니어 케어 구독 플랫폼 파밀리아 기획안에 공감하여 개발자로 합류하게 되었다. 

다양한 이유로 부모와 자식은 떨어져 사는 경우가 많고, 부모는 여력이 된다면 자식과 함께 사는 것은 자식에게 짐이 되는 것이라 생각하고 다양한 이유를 들어 거절한다. 따로 떨어져 살면 부모와 자식의 혈연 관계라도 소원해지기 마련이다. 하지만 부모와 자식의 관계는 점점 소원해져서 멀어져야 하는 관계가 아니다. 

바쁘다는 이유를 핑계로 명절과 휴가 시즌에 아버지를 찾아 뵙지만 한 해 한 해 나이가 들어가시는 아버지 걱정은 점점 커진다. 명절 방문과 용돈만으로는 불효한다는 생각을 지울 수가 없다. 매일 알람을 설정해 놓고 아버지께 전화를 해야지 하는데 알람을 보면 꺼버리고 매일 작은 죄책감을 느끼게 된다. 한번씩 온라인 쇼핑으로 아버지가 필요하신 것을 보내드리곤 하는데  잊고 지내거나 자주 있는 일이 아니다. 

70대의 혼자사는 아버지들은 생활에 뭐가 가장 필요할까. 의식주 중에서도 음식이 아닐까 싶다. 우리 아버지의 경우 자신이 즐겨 입는 옷은 이미 많다. 옷방에 옷이 많으시다. 외출도 그리 많지 않으니 옷에 대한 소비도 거의 없으시다. 음식은 남여노소 지위고하를 막론하고 인간이 생존하기 위해 끊임없이 섭취하기 위해 구매하고 소비해야 한다. 1인 가구가 요리 재료를 사서 직접 요리하여 먹는 것은 시간과 비용 측면에서 경제적인 방법이 아니다. 반찬 가게나 온라인으로 반찬을 구매하여 먹는 것이 경제적이다. 하지만 노인들의 경우 스마트폰으로 반찬을 매번 구매하여 먹는다는 것은 쉽지 않은 일이다. 근처에 반찬가게가 있으면 다행이고, 없으면 식사의 질이 낮은 경우가 많다. 글씨 크기가 새끼 손톱만한 노인들의 카톡을 본 적이 있을 것이다. 젊은 층이 사용하는 앱의 깨알같은 글씨의 서비스를 이용하는 것은 거의 불가능에 가깝다. 젊은 층이 만드는 서비스는 노인을 고려하지 않는다. 마치 시각장애인을 앱 서비스의 고객으로 간주하지 않는 현실과 비슷하다. 

주거의 경우는 남성 고령층의 경우 나이가 들수록 청소를 잘 하지 않는 것 같다. 먼지가 곳곳에 쌓여도 청소하기가 쉽지 않다. 활동성이 떨어지고 청소의 특성 상 앉고 일어서고 구부리고 하는 동작들은 노인들이 큰 마음먹고 청소해야 한다. 물론 청소의 경우는 개인별 성향에 따라서 많은 편차가 있을 것이다. 우리 아버지의 경우 혼자 살고 계시니 본인이 불편하지 않는 선에서 청소할 필요성을 느끼지 못하신다. 그래서 아버지 댁을 방문하면 불편한 나는 가장 먼저 내가 이동하는 동선부터 청소 한다. 청소를 하고 나면 기분이 개운하지만 시작하기는 매우 귀찮은 것이 청소다. 깨끗하지 않은 불편함이 더 크면 청소를 해야만 한다. 

반찬과 청소 이 두 가지를 해결해 드리면 좋겠다는 생각이 들었다. 주기적으로 필요한 서비스이기에 정기구독의 형태로 하고 부모님은 스마트폰에 익숙하지 않으니 자식들이 대신 정기구독 결제를 해서 반찬을 정기적으로 보내드리거나, 정기적으로 방문 청소를 해드리면서 부모님의 안부도 확인하고 나아가 잠깐이지만 사람과의 말동무도 해드리고 누군가 정기적으로 방문한다면 외로움이나 고립감을 완화할 수도 있을거라 생각했다. 자식들이 혼자 계신 부모님들께 드리고 싶은 생활 편의 건강 서비스를 모아 놓은 서비스를 중개하는 플랫폼을 만들어 보면 어떨까 하는 생각을 정리했고, 영상컨텐츠 제작 팀빌딩 스타트업을 운영하고 있는 알고 지내는 대표님을 만나 아이디어를 설명하고 이야기를 나눠봤다. 한 시간 남짓 이야기하며 좋은 아이디어 같고, 부모님께 한 달에 한번 한상 차림을 보내드리거나 나이드신 엄마에게는 한 달에 한번 정기 꽃배달을 이용하는 실제 사례를 들면서 다양한 서비스로 아이디어를 확장 했다. 

OECD 국가 중 노인자살율 압도적 1위인 우리나라의 노인 문제 해소에도 기여할 수 있을 거란 생각도 들었다.

한 달 정도는 앱개발 팀프로젝트 펀디에서 함께 했던 운영진들과 사이드프로젝트를 함께 했던 지인들, 스타트업 대표들과 만나 아이디어를 공유하고 시니어 케어 효도 구독 서비스에 대한 반응과 아이디어를 보완했다. 그렇게 팀빌딩용 기획서를 우선 만들어 함께할 팀원들을 찾아 나섰다. 

그 중 펀디에서 알게된 노인 분야 사회복지사로 포항에서 근무하고 있지만 서울까지 올라와서 사이드로 팀프로젝트를 수행하는 열정 넘치는 현재의 CSO가 가장 먼저 합류하게 되었다. 아이디어가 너무 좋고 자신의 경험과 인프라를 활용하여 함께 만들어 보고 싶다는 의견을 피력했고 나는 너무나 감사하게 팀원으로 맞이했다. 팀빌딩의 시작이 순조로웠고, 아이디어에 대한 확신을 얻을 수 있었던 그날은 2022년 6월 4일 이었다. 

동시에 유사한 서비스들이나 플랫폼은 없는지 검색을 병행했다. 내가 기획한 아이디어가 있다면 그런 서비스를 이용하면 되니 내가 또 만들 필요가 없다고 생각한다. 소중한 시간을 쏟아 붇고 싶은 아이디어는 많이 있으니 기존에 세상에 나와 있는 것을 비슷하게 따라하고 싶은 생각은 애초에 없었고 지금도 없다. 

어디까지 갈 지 몰랐지만 일단 한번 실행해보자는 생각으로 시작된 것이 지금의 파밀리아가 됐다. 그때는 지금처럼 예창패에 선정되고, 법인을 설립하고, 엑셀러레이팅에 선정될지 전혀 예상하지 못했다. 

다음 글 예고 : 두번째 팀원 구하기, 사이프로 팀빌딩 살롱


파밀리아

부모님 효도 구독 서비스 플랫폼

9
0
상원

상원

클로즈베타 절반을 지나가면서, 프릭스!

클로즈베타가 벌써 절반이나 지나갔네요!

6월 20일에 CBT를 시작하고, 어느새 두 달이라는 시간이 흘렀습니다.

최근 두 달은 정말 어떻게 흘러갔는지 모르겠네요.

밀도 있는 시간만큼 더 단단해진 기분도 듭니다.

프릭스 팀은 저와 코파운더 재하님 두 명 팀이었는데, 8월 1일자로 두영 님이 합류했습니다. 다른 스타트업의 tech lead 직책을 맡으시다가 합류하셔서 개발에 많은 힘을 보태주고 계세요. 좋은 분들과 함께 일한다는 것이 큰 행운이네요.

  • 프릭스 팀은 좋은 분들을 모시기 위해 적극적으로 커피챗을 하고 있습니다. 지금 바로 이직을 고려하시지는 않더라도, 이야기 나누고 싶으신 분들은 편하게 커피챗 신청해주세요 :)

서비스도 "계약의 주기 관리"에서 더 나아가서, "딜 관리"라는 개념으로 서비스의 영역을 확장했습니다. 딜이라는 개념을 도입하기 위해서 "고객관리"의 기능도 추가되었고요.

  • 결국 계약을 관리한다는 것은 고객과의 프로젝트를 관리해나가며, 주고 받을 서류와 돈을 관리한다는 것이라는 점을 알게 되었습니다.

  • 빠르게 기능을 배포해나가면서 고객의 반응을 살피고, 필요사항들을 고도화 해나가고 있습니다. 2주 간격으로 업데이트 내용을 알려드리고 있어요.

  • 곧 대시보드 기능이 업데이트 되면 개발의 큰 산을 넘을 것으로 생각하고 열심히 준비하고 있습니다.

  • 클로즈베타에 참여해주시면 향후 정식 서비스 시에 큰 할인 혜택을 드릴 예정이오니, 많은 참여 신청 부탁드립니다. 의견을 들려주세요!

스프링캠프의 엑셀러레이팅 프로그램 "캠프파이어"도 즐겁게 참여하고 있습니다.

스타트업은 자유로운 업무 문화이지만, 간혹 업무 강도가 너무 세기 때문에 적절한 리프레시가 필요하다고 생각이 들었는데, 주3회 운동 및 주1회 명상을 통해서 적절한 균형을 잡을 수 있었던 것 같습니다.

다음 기수를 모집하면 꼭 지원해보세요. 투자 이상의 것을 얻으실 수 있습니다.

달리기도 꾸준히 하고 있습니다.

지난 주 토요일에는 10km 마라톤 대회에 참여했네요. 비록 1시간은 오버했지만, 달리기는 여전히 즐겁습니다.

기회가 되면 스타트업 러닝 클럽 한 번 만들어보고 싶네요.

KakaoTalk_Photo_2023-08-20-13-56-58.jpeg

바쁜 중에서도 한 번씩 주위를 둘러봐야겠다고 생각이 드는 요즘입니다.

모두 평안하세요.

프릭스 Prix

심플한 계약관리 솔루션

7
0