๐Ÿค– AI-Powered App Stack

11 min read
python fastapi langchain pinecone openai anthropic redis postgresql docker kubernetes prometheus grafana llm rag vector-db

ํ”„๋กœ๋•์…˜ ๋ ˆ๋ฒจ AI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์ถ•์„ ์œ„ํ•œ ๊ฒ€์ฆ๋œ ๊ธฐ์ˆ  ์Šคํƒ - LangChain, FastAPI, Vector DB๋กœ RAG ์‹œ์Šคํ…œ ๊ตฌํ˜„

๐Ÿค– AI-Powered App Stack

ํ”„๋กœ๋•์…˜ ๋ ˆ๋ฒจ AI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ๊ฒ€์ฆ๋œ ๊ธฐ์ˆ  ์Šคํƒ
"Build AI that scales, not just demos" - ์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ AI ์ธํ”„๋ผ ๊ตฌ์ถ•


๐ŸŽฏ ์ด ์Šคํƒ์ด ์ ํ•ฉํ•œ ๊ฒฝ์šฐ

โœ… ์ถ”์ฒœํ•˜๋Š” ๊ฒฝ์šฐ

  • RAG (Retrieval-Augmented Generation) ์‹œ์Šคํ…œ ๊ตฌ์ถ•
  • ๋Œ€๊ทœ๋ชจ ๋ฌธ์„œ ์ฒ˜๋ฆฌ์™€ ์˜๋ฏธ ๊ฒ€์ƒ‰ ํ•„์š”
  • ๋ฉ€ํ‹ฐ LLM ์ง€์› (OpenAI, Anthropic, Gemini ๋“ฑ)
  • ์‹ค์‹œ๊ฐ„ AI ์‘๋‹ต์ด ์ค‘์š”ํ•œ ์„œ๋น„์Šค
  • ๋น„์šฉ ์ตœ์ ํ™”์™€ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•„์ˆ˜

โŒ ๋‹ค๋ฅธ ์Šคํƒ์„ ๊ณ ๋ คํ•ด์•ผ ํ•  ๊ฒฝ์šฐ

  • ๋‹จ์ˆœ ์ฑ—๋ด‡๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ โ†’ OpenAI Assistants API
  • ์ด๋ฏธ์ง€/๋น„๋””์˜ค AI๊ฐ€ ์ค‘์‹ฌ์ธ ๊ฒฝ์šฐ โ†’ GPU ํŠนํ™” ์Šคํƒ
  • ์—ฃ์ง€ ๋””๋ฐ”์ด์Šค AI โ†’ TensorFlow Lite / ONNX

๐Ÿงฉ ํ•ต์‹ฌ ๊ตฌ์„ฑ์š”์†Œ

AI/ML ๋ ˆ์ด์–ด

# ํ•ต์‹ฌ AI ์Šคํƒ ai_stack = { "orchestration": "LangChain", "llm_providers": ["OpenAI", "Anthropic", "Google", "Local LLMs"], "embeddings": "OpenAI Ada-002 / Cohere", "vector_db": "Pinecone / Weaviate", "memory": "Redis", "monitoring": "Langfuse / Helicone" } 

LangChain์˜ ๊ฐ•์ :

  • ๋‹ค์–‘ํ•œ LLM ํ†ตํ•ฉ ์ง€์›
  • ์ฒด์ธ๊ณผ ์—์ด์ „ํŠธ ํŒจํ„ด
  • ๋ฌธ์„œ ๋กœ๋”์™€ ํ…์ŠคํŠธ ๋ถ„ํ• 
  • ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ ๊ด€๋ฆฌ

Backend API

# FastAPI ๊ธฐ๋ฐ˜ ๋ฐฑ์—”๋“œ from fastapi import FastAPI, BackgroundTasks from langchain.chains import ConversationalRetrievalChain from langchain.memory import ConversationSummaryBufferMemory app = FastAPI() @app.post("/chat") async def chat_endpoint( message: str, session_id: str, background_tasks: BackgroundTasks ): # ๋ฒกํ„ฐ ๊ฒ€์ƒ‰ relevant_docs = await vector_store.similarity_search(message) # LLM ์ฒด์ธ ์‹คํ–‰ response = await chain.arun( question=message, chat_history=memory.get(session_id) ) # ๋น„๋™๊ธฐ ๋กœ๊น… background_tasks.add_task(log_interaction, message, response) return {"response": response, "sources": relevant_docs} 

๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ

# ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์•„ํ‚คํ…์ฒ˜ pipeline: ingestion: - Document Loaders (PDF, Web, APIs) - Text Splitters (Recursive, Token-based) - Embedding Generation storage: - PostgreSQL: ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ - Pinecone: ๋ฒกํ„ฐ ์ž„๋ฒ ๋”ฉ - S3: ์›๋ณธ ๋ฌธ์„œ - Redis: ์„ธ์…˜ ๋ฉ”๋ชจ๋ฆฌ, ์บ์‹ฑ processing: - Celery: ๋น„๋™๊ธฐ ์ž‘์—… ํ - Apache Airflow: ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ 

์ธํ”„๋ผ & ๋ฐฐํฌ

# Kubernetes ๋ฐฐํฌ ๊ตฌ์„ฑ services: api: replicas: 3 resources: requests: memory: "2Gi" cpu: "1000m" limits: memory: "4Gi" cpu: "2000m" worker: replicas: 5 autoscaling: minReplicas: 2 maxReplicas: 10 targetCPUUtilization: 70 vector-db: type: "managed" # Pinecone Cloud cache: type: "redis-cluster" nodes: 3 

๐Ÿ’ฐ ์ƒ์„ธ ๋น„์šฉ ๋ถ„์„

| ์„œ๋น„์Šค | ์ตœ์†Œ ๊ตฌ์„ฑ | ํ‘œ์ค€ ๊ตฌ์„ฑ | ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ | |--------|-----------|-----------|--------------| | LLM API | $100/์›”(GPT-3.5) | $500/์›”(GPT-4 ํ˜ผํ•ฉ) | $2,000+/์›”(์ „์šฉ ์ธ์Šคํ„ด์Šค) | | Vector DB | $70/์›”(Pinecone Starter) | $400/์›”(Standard) | $2,000+/์›”(Enterprise) | | ์ธํ”„๋ผ (K8s) | $200/์›”(3 nodes) | $800/์›”(5 nodes) | $3,000+/์›”(10+ nodes) | | ๋ชจ๋‹ˆํ„ฐ๋ง | $50/์›” | $200/์›” | $500+/์›” | | PostgreSQL | $25/์›” | $100/์›” | $500+/์›” | | Redis | $25/์›” | $100/์›” | $300+/์›” | | ์ด๊ณ„ | ~$470/์›” | ~$2,100/์›” | ~$8,300+/์›” |

๐Ÿ’ก ๋น„์šฉ ์ตœ์ ํ™” ์ „๋žต

# 1. ์บ์‹ฑ์œผ๋กœ API ํ˜ธ์ถœ ๊ฐ์†Œ @cache(ttl=3600) async def get_embedding(text: str): return await openai.embeddings.create( input=text, model="text-embedding-ada-002" ) # 2. ๋ชจ๋ธ ๋ผ์šฐํŒ…์œผ๋กœ ๋น„์šฉ ์ ˆ๊ฐ def route_to_model(query_complexity: float): if query_complexity < 0.3: return "gpt-3.5-turbo" # ๊ฐ„๋‹จํ•œ ์งˆ๋ฌธ elif query_complexity < 0.7: return "gpt-4" # ์ค‘๊ฐ„ ๋ณต์žก๋„ else: return "gpt-4-turbo" # ๋ณต์žกํ•œ ์ถ”๋ก  

๐Ÿš€ ๊ตฌํ˜„ ๋กœ๋“œ๋งต

Phase 1: MVP (2์ฃผ)

# ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™” mkdir ai-app && cd ai-app python -m venv venv source venv/bin/activate # ํ•ต์‹ฌ ์˜์กด์„ฑ ์„ค์น˜ pip install fastapi langchain openai pinecone-client redis # ๊ธฐ๋ณธ API ์„œ๋ฒ„ uvicorn main:app --reload 

๊ตฌํ˜„ ๋ชฉํ‘œ:

  • ๊ธฐ๋ณธ ์ฑ„ํŒ… ์ธํ„ฐํŽ˜์ด์Šค
  • ๋ฌธ์„œ ์—…๋กœ๋“œ ๋ฐ ์ž„๋ฒ ๋”ฉ
  • ๊ฐ„๋‹จํ•œ RAG ํŒŒ์ดํ”„๋ผ์ธ
  • ์„ธ์…˜ ๊ด€๋ฆฌ

Phase 2: ํ”„๋กœ๋•์…˜ ์ค€๋น„ (2์ฃผ)

# ํ”„๋กœ๋•์…˜ ์„ค์ • class ProductionConfig: # LLM ์„ค์ • LLM_PROVIDER = "openai" LLM_MODEL = "gpt-4-turbo-preview" LLM_TEMPERATURE = 0.7 LLM_MAX_TOKENS = 2000 # ๋ฒกํ„ฐ DB PINECONE_API_KEY = os.getenv("PINECONE_API_KEY") PINECONE_INDEX = "production-index" PINECONE_DIMENSION = 1536 # ์บ์‹ฑ REDIS_URL = os.getenv("REDIS_URL") CACHE_TTL = 3600 # ๋ชจ๋‹ˆํ„ฐ๋ง LANGFUSE_PUBLIC_KEY = os.getenv("LANGFUSE_PUBLIC_KEY") SENTRY_DSN = os.getenv("SENTRY_DSN") 

Phase 3: ์Šค์ผ€์ผ๋ง (2-4์ฃผ)

  • ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ: ๋‹ค์ค‘ API ์„œ๋ฒ„
  • ์ž‘์—… ํ: Celery + RabbitMQ
  • ๋ชจ๋‹ˆํ„ฐ๋ง: Prometheus + Grafana
  • A/B ํ…Œ์ŠคํŒ…: ํ”„๋กฌํ”„ํŠธ ์ตœ์ ํ™”

Phase 4: ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ (4์ฃผ+)

  • ํŒŒ์ธํŠœ๋‹: ๋„๋ฉ”์ธ ํŠนํ™” ๋ชจ๋ธ
  • ์—์ด์ „ํŠธ: ์ž์œจ ์ž‘์—… ์ˆ˜ํ–‰
  • ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ: ์ด๋ฏธ์ง€/์Œ์„ฑ ์ฒ˜๋ฆฌ
  • ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ: WebSocket ์ง€์›

๐Ÿ—๏ธ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด

RAG ํŒŒ์ดํ”„๋ผ์ธ

class RAGPipeline: def __init__(self): self.embeddings = OpenAIEmbeddings() self.vector_store = Pinecone( index_name="knowledge-base", embedding_function=self.embeddings ) self.llm = ChatOpenAI(temperature=0.7) async def process_query(self, query: str, k: int = 5): # 1. ์ฟผ๋ฆฌ ์ž„๋ฒ ๋”ฉ query_embedding = await self.embeddings.aembed_query(query) # 2. ์œ ์‚ฌ ๋ฌธ์„œ ๊ฒ€์ƒ‰ relevant_docs = await self.vector_store.asimilarity_search( query_embedding, k=k ) # 3. ์ปจํ…์ŠคํŠธ ๊ตฌ์„ฑ context = "\n".join([doc.page_content for doc in relevant_docs]) # 4. LLM ์‘๋‹ต ์ƒ์„ฑ prompt = f""" Context: {context} Question: {query} Please provide a comprehensive answer based on the context. """ response = await self.llm.agenerate([prompt]) return { "answer": response.generations[0][0].text, "sources": [doc.metadata for doc in relevant_docs] } 

ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง

# ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ ๊ด€๋ฆฌ class PromptManager: templates = { "qa": """You are a helpful AI assistant. Context: {context} Question: {question} Instructions: {instructions} Answer:""", "summarization": """Summarize the following text: {text} Summary (max {max_words} words):""", "extraction": """Extract the following information: {fields} From text: {text} Output as JSON:""" } @classmethod def get_prompt(cls, template_name: str, **kwargs): template = cls.templates.get(template_name) return template.format(**kwargs) 

์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐ ํด๋ฐฑ

class LLMService: def __init__(self): self.primary_llm = ChatOpenAI(model="gpt-4") self.fallback_llm = ChatAnthropic(model="claude-2") self.emergency_llm = ChatOpenAI(model="gpt-3.5-turbo") async def get_response(self, prompt: str, max_retries: int = 3): # ๊ธฐ๋ณธ LLM ์‹œ๋„ try: return await self.primary_llm.agenerate([prompt]) except RateLimitError: # ๋Œ€์ฒด LLM์œผ๋กœ ํด๋ฐฑ try: return await self.fallback_llm.agenerate([prompt]) except Exception: # ์ตœ์ข… ํด๋ฐฑ return await self.emergency_llm.agenerate([prompt]) 

๐Ÿ”„ ๋Œ€์•ˆ ๋ฐ ๋ณ€ํ˜•

์˜คํ”ˆ์†Œ์Šค ์šฐ์„  ์Šคํƒ

| ์ปดํฌ๋„ŒํŠธ | ์ƒ์šฉ | ์˜คํ”ˆ์†Œ์Šค ๋Œ€์•ˆ | |----------|------|---------------| | LLM | OpenAI | Llama 2, Mistral | | Vector DB | Pinecone | Weaviate, Qdrant | | ๋ชจ๋‹ˆํ„ฐ๋ง | Datadog | Prometheus + Grafana | | ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ | LangChain | LlamaIndex, Haystack |

ํด๋ผ์šฐ๋“œ๋ณ„ ์ตœ์ ํ™”

# AWS ์Šคํƒ aws: llm: "Bedrock (Claude, Llama)" vector_db: "OpenSearch" compute: "EKS" storage: "S3" monitoring: "CloudWatch" # Azure ์Šคํƒ azure: llm: "Azure OpenAI Service" vector_db: "Azure Cognitive Search" compute: "AKS" storage: "Blob Storage" monitoring: "Application Insights" # GCP ์Šคํƒ gcp: llm: "Vertex AI (PaLM, Gemini)" vector_db: "Vertex AI Matching Engine" compute: "GKE" storage: "Cloud Storage" monitoring: "Cloud Monitoring" 

๐Ÿ† ์„ฑ๊ณต ์‚ฌ๋ก€

Perplexity AI

  • ์Šคํƒ: Custom LLM + Proprietary Vector Search
  • ํŠน์ง•: ์‹ค์‹œ๊ฐ„ ์›น ๊ฒ€์ƒ‰ ํ†ตํ•ฉ
  • ์„ฑ๊ณผ: ์›” 1000๋งŒ+ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ

Jasper AI

  • ์Šคํƒ: GPT-3/4 + Custom Fine-tuning
  • ํŠน์ง•: ๋งˆ์ผ€ํŒ… ์ฝ˜ํ…์ธ  ํŠนํ™”
  • ์„ฑ๊ณผ: $1.5B ๋ฐธ๋ฅ˜์—์ด์…˜

Glean

  • ์Šคํƒ: ๋ฉ€ํ‹ฐ LLM + Enterprise Search
  • ํŠน์ง•: ๊ธฐ์—… ๋‚ด๋ถ€ ์ง€์‹ ๊ฒ€์ƒ‰
  • ์„ฑ๊ณผ: $2.2B ๋ฐธ๋ฅ˜์—์ด์…˜

๐Ÿ“š ํ•„์ˆ˜ ๋ฆฌ์†Œ์Šค

ํ”„๋ ˆ์ž„์›Œํฌ & ๋„๊ตฌ

ํ•™์Šต ์ž๋ฃŒ

์ปค๋ฎค๋‹ˆํ‹ฐ


๐Ÿ’ฌ ์‹ค๋ฌด์ž ์กฐ์–ธ

"ํ”„๋กœ๋•์…˜์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฑด ์—๋Ÿฌ ์ฒ˜๋ฆฌ์˜ˆ์š”. LLM์€ ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ์‹คํŒจํ•˜๋ฏ€๋กœ ํ•ญ์ƒ ํด๋ฐฑ ์ „๋žต์„ ์ค€๋น„ํ•˜์„ธ์š”." - @aieng_pro

"๋ฒกํ„ฐ DB ์„ ํƒ์ด ์ •๋ง ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐ์—” Pinecone์ด ํŽธํ•˜์ง€๋งŒ, ์Šค์ผ€์ผ ์ปค์ง€๋ฉด ์ž์ฒด ํ˜ธ์ŠคํŒ… ๊ณ ๋ คํ•˜์„ธ์š”." - @vectordb_expert

"ํ† ํฐ ๋น„์šฉ์ด ์ง„์งœ ๋ฌธ์ œ. ์บ์‹ฑ ์ „๋žต ์—†์ด๋Š” ์›” ์ˆ˜์ฒœ ๋‹ฌ๋Ÿฌ ๋‚˜๊ฐ‘๋‹ˆ๋‹ค. Redis๋กœ ์ž„๋ฒ ๋”ฉ ์บ์‹ฑํ•˜๋‹ˆ 70% ์ ˆ๊ฐํ–ˆ์–ด์š”." - @frugal_ai_dev

"ํ”„๋กฌํ”„ํŠธ ๋ฒ„์ „ ๊ด€๋ฆฌ ๊ผญ ํ•˜์„ธ์š”. Git์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  A/B ํ…Œ์ŠคํŠธํ•˜๋ฉด ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ๋†€๋ž์Šต๋‹ˆ๋‹ค." - @prompt_engineer


โšก ์„ฑ๋Šฅ ์ตœ์ ํ™”

์‘๋‹ต ์‹œ๊ฐ„ ๋‹จ์ถ•

# 1. ์ŠคํŠธ๋ฆฌ๋ฐ ์‘๋‹ต @app.get("/stream") async def stream_response(query: str): async def generate(): async for chunk in llm.astream(query): yield f"data: {chunk}\n\n" return StreamingResponse(generate(), media_type="text/event-stream") # 2. ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ async def parallel_search(query: str): tasks = [ vector_store.asimilarity_search(query), keyword_search(query), cache.get(query) ] results = await asyncio.gather(*tasks) return merge_results(results) 

๋น„์šฉ ์ตœ์ ํ™”

# 3. ์Šค๋งˆํŠธ ์บ์‹ฑ class SmartCache: def __init__(self, ttl_matrix): self.ttl_matrix = ttl_matrix # ์ฟผ๋ฆฌ ํƒ€์ž…๋ณ„ TTL async def get_or_compute(self, key: str, compute_fn, query_type: str): cached = await redis.get(key) if cached: return json.loads(cached) result = await compute_fn() ttl = self.ttl_matrix.get(query_type, 3600) await redis.setex(key, ttl, json.dumps(result)) return result 

๐Ÿšจ ์ฃผ์˜์‚ฌํ•ญ

๋ณด์•ˆ

  • API ํ‚ค ๋…ธ์ถœ ๋ฐฉ์ง€ (ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์‚ฌ์šฉ)
  • ํ”„๋กฌํ”„ํŠธ ์ธ์ ์…˜ ๋ฐฉ์–ด
  • PII ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง
  • Rate limiting ๊ตฌํ˜„

๊ทœ์ • ์ค€์ˆ˜

  • GDPR/CCPA ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
  • ์˜๋ฃŒ/๊ธˆ์œต ๋ถ„์•ผ ๊ทœ์ •
  • AI ์œค๋ฆฌ ๊ฐ€์ด๋“œ๋ผ์ธ
  • ๋ฐ์ดํ„ฐ ๋ณด์กด ์ •์ฑ…

๋ชจ๋‹ˆํ„ฐ๋ง ํ•„์ˆ˜ ์ง€ํ‘œ

  • Token ์‚ฌ์šฉ๋Ÿ‰ ๋ฐ ๋น„์šฉ
  • ์‘๋‹ต ์‹œ๊ฐ„ (P50, P90, P99)
  • ์—๋Ÿฌ์œจ ๋ฐ ํด๋ฐฑ ๋นˆ๋„
  • ์‚ฌ์šฉ์ž ๋งŒ์กฑ๋„ (ํ”ผ๋“œ๋ฐฑ ์ˆ˜์ง‘)

๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ: 2025-01-28
๊ธฐ์—ฌํ•˜๊ธฐ: GitHub์—์„œ ํŽธ์ง‘

Found this helpful? Share it with others!
Tweet

๐Ÿ”— Related Content

You might also be interested in these articles

๐Ÿ—๏ธ stack

๐Ÿข Enterprise Microservices Stack

๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ๊ณผ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์œ„ํ•œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜ - Go, gRPC, Kubernetes๋กœ ๊ตฌ์ถ•ํ•˜๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ

12 min read
go, grpc+13
Read more
๐Ÿ—๏ธ stack

๐Ÿ”„ Realtime Collaboration Stack

Figma, Notion ๊ฐ™์€ ์‹ค์‹œ๊ฐ„ ํ˜‘์—… ์•ฑ ๊ตฌ์ถ•์„ ์œ„ํ•œ ๊ธฐ์ˆ  ์Šคํƒ - WebSocket, CRDT, WebRTC๋กœ ๋งŒ๋“œ๋Š” ๋™์‹œ ํŽธ์ง‘ ์‹œ์Šคํ…œ

20 min read
nodejs, socketio+13
Read more
๐Ÿ—๏ธ stack

AI-Integrated Fullstack Stack 2025

LLM๊ณผ AI๋ฅผ ํ†ตํ•ฉํ•œ ํ’€์Šคํƒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ์ˆ  ์Šคํƒ

4 min read
stack, ai+4
Read more
๐Ÿข company

๐Ÿข Canva ๊ธฐ์ˆ  ์Šคํƒ ๋ถ„์„

์บ”๋ฐ”๊ฐ€ 1์–ต ๋ช… ์ด์ƒ์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‰ฝ๊ณ  ๊ฐ•๋ ฅํ•œ ๋””์ž์ธ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ˆ  ์Šคํƒ ์‹ฌ์ธต ๋ถ„์„ - Java, TypeScript, AWS๋กœ ๊ตฌ์ถ•ํ•œ ๋Œ€๊ทœ๋ชจ ๋””์ž์ธ ํ”Œ๋žซํผ

35 min read
canva, java+10
Read more
๐Ÿข company

๐Ÿข ๋‹น๊ทผ๋งˆ์ผ“ ๊ธฐ์ˆ  ์Šคํƒ ๋ถ„์„

๋‹น๊ทผ๋งˆ์ผ“์ด ๋™๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ํ˜์‹ ํ•˜๋ฉฐ ์œ ๋‹ˆ์ฝ˜์œผ๋กœ ์„ฑ์žฅํ•œ ๊ธฐ์ˆ  ์Šคํƒ ์‹ฌ์ธต ๋ถ„์„ - Ruby on Rails, Kotlin, Swift๋กœ ๋งŒ๋“  ํ•˜์ดํผ๋กœ์ปฌ ํ”Œ๋žซํผ

53 min read
karrot, daangn+9
Read more
๐Ÿข company

๐Ÿข ๋ฐฐ๋‹ฌ์˜๋ฏผ์กฑ ๊ธฐ์ˆ  ์Šคํƒ ๋ถ„์„

๋ฐฐ๋‹ฌ์˜๋ฏผ์กฑ์ด ํ•œ๊ตญ ๋ฐฐ๋‹ฌ ๋ฌธํ™”๋ฅผ ํ˜์‹ ํ•˜๋ฉฐ ๋™๋‚จ์•„๋กœ ํ™•์žฅํ•œ ๊ธฐ์ˆ  ์Šคํƒ ์‹ฌ์ธต ๋ถ„์„ - Java, Spring, Kotlin์œผ๋กœ ๊ตฌ์ถ•ํ•œ O2O ํ”Œ๋žซํผ

56 min read
baemin, woowa+10
Read more

Found this helpful?

Help us improve this content by contributing on GitHub or sharing your feedback with the community.