Skip to content

Latest commit

ย 

History

1,565 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

2026 ์ƒ๋ช…๋Œ€ํ•™๊ต ์กธ์—… ํ”„๋กœ์ ํŠธ

๋ถ„์‚ฐ๋œ ๊ด‘๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ๋Œ€์‹œ๋ณด๋“œ๋กœ ๊ด‘๊ณ  ์„ฑ๊ณผ๋ฅผ ํ†ตํ•ฉํ•˜๊ณ  AI๊ฐ€ ๋ถ„์„ํ•ด ๋“œ๋ฆฝ๋‹ˆ๋‹ค

wyad

Java Spring Boot Spring Cloud MySQL Redis Kafka Docker

๐Ÿ† ์ƒ๋ช…๋Œ€ํ•™๊ต ๊ต๋‚ด ์ฐฝ์—…์•„์ด๋””์–ด ๊ฒฝ์ง„๋Œ€ํšŒ ๋Œ€์ƒ

๐Ÿ† ๋ชจ๋‘์˜ ์ฐฝ์—… ๊ณต๋ชจ์ „ 1๊ธฐ ์„ ์ • ยท ๋ณธ์„  ์ง„์ถœ


๐Ÿ“Œ Overview

WhereYouAd๋Š” Google, Naver, Meta 3๊ฐœ ๊ด‘๊ณ  ํ”Œ๋žซํผ์˜ ์„ฑ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹จ์ผ ๋Œ€์‹œ๋ณด๋“œ์— ํ†ตํ•ฉํ•˜๋Š” B2B SaaS์ž…๋‹ˆ๋‹ค. ํŒ€ ๋‹จ์œ„ ์›Œํฌ์ŠคํŽ˜์ด์Šค๋กœ ๋ฉค๋ฒ„๊ฐ€ ํ˜‘์—…ํ•˜๋ฉฐ, AI ๋ถ„์„ ๋ฆฌํฌํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  PDF๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

WhereYouAd Backend๋Š” Spring Boot ๊ธฐ๋ฐ˜์˜ 2026 ์บก์Šคํ†ค ์กธ์—… ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ์ธ์ฆ ๋ฐฉ์‹๊ณผ ์‘๋‹ต ์Šคํ‚ค๋งˆ๋ฅผ ๊ฐ€์ง„ 3๊ฐœ ๊ด‘๊ณ  ํ”Œ๋žซํผ API๋ฅผ ํ•˜๋‚˜์˜ ๋„๋ฉ”์ธ ๋ชจ๋ธ๋กœ ์ •๊ทœํ™”ํ•˜๊ณ , Kafka ๊ธฐ๋ฐ˜ ํด๋ฆญ ์ด๋ฒคํŠธ ํŒŒ์ดํ”„๋ผ์ธยทSSE ์‹ค์‹œ๊ฐ„ ์ „์†กยทOpenAI ๋ฆฌํฌํŠธ ์ƒ์„ฑ๊นŒ์ง€ ๋„๋ฉ”์ธ ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜ ์œ„์—์„œ ์ง์ ‘ ์„ค๊ณ„ยท๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.


ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์˜์—ญ

  • Google Ads / Meta Marketing / Naver Search Ad API ํ†ตํ•ฉ ๋ฐ ์ง€ํ‘œ ์ •๊ทœํ™”
  • OAuth2 ์†Œ์…œ ๋กœ๊ทธ์ธ(NaverยทGoogleยทKakao) + JWT ์ธ์ฆ/์žฌ๋ฐœ๊ธ‰
  • Kafka ๊ธฐ๋ฐ˜ ํด๋ฆญ ์ด๋ฒคํŠธ ์ˆ˜์ง‘ ยท ๋ด‡ ํ•„ํ„ฐ๋ง ยท SSE ์‹ค์‹œ๊ฐ„ ์ „์†ก
  • ๊ด‘๊ณ  ํŠธ๋ž˜ํ‚น ๋งํฌ ๋ฐœ๊ธ‰ (shortURL ์ฝ”๋“œ + ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์ˆ˜์ง‘)
  • OpenAI ๊ธฐ๋ฐ˜ AI ๋ถ„์„ ๋ฆฌํฌํŠธ ๋น„๋™๊ธฐ ์ƒ์„ฑ ๋ฐ ์ด๋ฉ”์ผ ๋ฐœ์†ก
  • ์กฐ์ง(์›Œํฌ์ŠคํŽ˜์ด์Šค) ยท ๋ฉค๋ฒ„ ์ดˆ๋Œ€ ยท RBAC ๊ถŒํ•œ ๊ด€๋ฆฌ
  • ๊ธฐ๊ฐ„ ๋น„๊ต ๊ธฐ๋ฐ˜ ํƒ€์ž„๋ผ์ธ ์„ฑ๊ณผ ๋ถ„์„
  • ์ฃผ๊ฐ„ ๋ฆฌํฌํŠธ ์Šค์ผ€์ค„๋Ÿฌ + Discord / Slack Webhook ์•Œ๋ฆผ

๐Ÿ“‘ Table of Contents


๐Ÿ›  Tech Stack

Category Stack
Core Java 17, Spring Boot 3.5.9, Spring Cloud 2024.0.1, Gradle
Security Spring Security, OAuth2 Client (NaverยทGoogleยทKakao), JWT(jjwt 0.11.5), AES
Persistence MySQL 8.0, Spring Data JPA (Hibernate)
Cache Redis (RefreshToken ยท ์ธ์ฆ ์ฝ”๋“œ ยท ํ† ํฐ ์บ์‹œ)
Messaging Apache Kafka 3.7.0 (ํด๋ฆญ ์ด๋ฒคํŠธ Producer / Consumer)
Realtime SSE (SseEmitter + SseEmitterRepository)
HTTP Client OpenFeign (OpenAI), WebClient (GoogleยทMetaยทNaver Ads)
Ad Platform Google Ads API 42.0.0, Meta Marketing API, Naver Search Ad API
AI OpenAI API (๋ถ„์„ ๋ฆฌํฌํŠธ ยท ์˜ˆ์‚ฐ ์ถ”์ฒœ)
Notification Gmail SMTP + Thymeleaf, Discord / Slack Webhook, CoolSMS(nurigo 4.3.0)
Storage AWS S3 (Spring Cloud AWS 3.4.2)
Resilience Spring Retry + Spring AOP (์™ธ๋ถ€ API ์žฌ์‹œ๋„)
Scheduling Spring Scheduler (ํ”Œ๋žซํผ ๋™๊ธฐํ™” ยท ์ฃผ๊ฐ„ ๋ฆฌํฌํŠธ ยท ๊ณ„์ • ์ •๋ฆฌ)
Docs Springdoc OpenAPI 2.8.0 (Swagger UI)
Config Spring Dotenv 4.0.0 (.env ๋กœ๋”ฉ)
Test JUnit 5, Spring Boot Test, Spring Security Test
Deploy Docker, Docker Compose, Docker Hub, AWS EC2 (Bastion ๊ฒฝ์œ  ๋ฐฐํฌ)

๐Ÿš€ Getting Started

Prerequisites

java -version
# openjdk version "17.x.x"

Docker / Docker Compose๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (MySQL ยท Redis ยท Kafka ๋กœ์ปฌ ๊ตฌ๋™)

Installation

cp .env.example .env

Run Local Server

./gradlew bootRun

Run Full Stack

docker-compose up -d

Build

./gradlew clean build -x test

์•ฑ์ด ๋œจ๋ฉด http://localhost:8080/swagger-ui/index.html ์—์„œ API ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“œ Scripts

Command Description
./gradlew build ํ…Œ์ŠคํŠธ๋ฅผ ํฌํ•จํ•œ ์ „์ฒด ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
./gradlew clean build -x test ํ…Œ์ŠคํŠธ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. (CD์—์„œ ์‚ฌ์šฉ)
./gradlew test ํ…Œ์ŠคํŠธ๋งŒ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. (MySQL + Redis ํ•„์š”)
./gradlew bootRun ๋กœ์ปฌ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. (.env ํ•„์š”)
docker-compose up -d App + MySQL + Redis + Kafka ์ „์ฒด ์Šคํƒ์„ ๋„์›๋‹ˆ๋‹ค.
docker-compose logs -f app ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ Project Structure

src/main/java/com/whereyouad/WhereYouAd
โ”œโ”€โ”€ domains                    # ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ (๊ณ„์ธตํ˜• ํŒจํ‚ค์ง€)
โ”‚   โ”œโ”€โ”€ user/                  # ํšŒ์›, ์†Œ์…œ ๋กœ๊ทธ์ธ, ๊ณ„์ • ์ฐพ๊ธฐยท๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ •
โ”‚   โ”œโ”€โ”€ organization/          # ์›Œํฌ์ŠคํŽ˜์ด์Šค, ๋ฉค๋ฒ„ ์ดˆ๋Œ€, OrgRole(RBAC)
โ”‚   โ”œโ”€โ”€ project/               # ํ”„๋กœ์ ํŠธ ๋‹จ์œ„ ๊ด‘๊ณ  ์บ ํŽ˜์ธ ๊ทธ๋ฃน
โ”‚   โ”œโ”€โ”€ platform/              # ํ”Œ๋žซํผ ๊ณ„์ •ยท์—ฐ๋™ ์ƒํƒœ, ๋™๊ธฐํ™” ์Šค์ผ€์ค„๋Ÿฌ
โ”‚   โ”œโ”€โ”€ advertisement/         # ์บ ํŽ˜์ธยท๊ด‘๊ณ ๊ทธ๋ฃนยท์†Œ์žฌยท์˜ˆ์‚ฐยทMetricFact
โ”‚   โ”‚   โ””โ”€โ”€ domain/service/adapi/{google,meta}  # ํ”Œ๋žซํผ๋ณ„ ์—ฐ๋™ ์„œ๋น„์Šค
โ”‚   โ”œโ”€โ”€ dashboard/             # ํ†ตํ•ฉ KPI ์ง‘๊ณ„, ํด๋ฆญ ๋Œ€์‹œ๋ณด๋“œ
โ”‚   โ”œโ”€โ”€ timeline/              # ํƒ€์ž„๋ผ์ธ CRUD ๋ฐ ๋น„๊ต ์„ฑ๊ณผ ๋ถ„์„ 
โ”‚   โ”œโ”€โ”€ click/                 # ํŠธ๋ž˜ํ‚น URL, BotDetector, ClickEventProducer
โ”‚   โ”œโ”€โ”€ ai/                    # OpenAI ๋ฆฌํฌํŠธ ๋น„๋™๊ธฐ ์ƒ์„ฑ (AIStatus)
โ”‚   โ”œโ”€โ”€ notification/          # ์•Œ๋ฆผ ์„ค์ •, ์ฃผ๊ฐ„ ๋ฆฌํฌํŠธ ์Šค์ผ€์ค„๋Ÿฌ, ๋ฐœ์†ก ์ด๋ ฅ
โ”‚   โ””โ”€โ”€ image/                 # ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ
โ”‚
โ”‚   โ””โ”€โ”€ {domain}/              # ๊ณตํ†ต ๊ณ„์ธต ๊ตฌ์กฐ
โ”‚       โ”œโ”€โ”€ application/       # dto/request ยท dto/response ยท mapper
โ”‚       โ”œโ”€โ”€ domain/            # service (๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง) ยท constant (Enum)
โ”‚       โ”œโ”€โ”€ persistence/       # entity (JPA) ยท repository
โ”‚       โ”œโ”€โ”€ presentation/      # Controller + docs (Swagger ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ)
โ”‚       โ””โ”€โ”€ exception/         # Handler + code (BaseErrorCode ๊ตฌํ˜„์ฒด)
โ”‚
โ”œโ”€โ”€ global                     # ์ „์—ญ ์ธํ”„๋ผ ๋ ˆ์ด์–ด
โ”‚   โ”œโ”€โ”€ security/
โ”‚   โ”‚   โ”œโ”€โ”€ jwt/               # JwtTokenProvider, JwtAuthenticationFilter
โ”‚   โ”‚   โ”œโ”€โ”€ oauth2/            # NaverยทGoogleยทKakao Response ์ถ”์ƒํ™” + SuccessHandler
โ”‚   โ”‚   โ”œโ”€โ”€ cookie/            # AuthCookieFactory (SameSiteยทSecure ์ œ์–ด)
โ”‚   โ”‚   โ””โ”€โ”€ SecurityConfig.java
โ”‚   โ”œโ”€โ”€ adapi/                 # AdAuthFactory + AdAuthStrategy (ํ”Œ๋žซํผ ์ธ์ฆ ์ถ”์ƒํ™”)
โ”‚   โ”œโ”€โ”€ config/                # Swagger, Redis, WebClient, OpenAIFeign, Retry
โ”‚   โ”œโ”€โ”€ response/              # BaseResponse, DataResponse<T>, ErrorResponse
โ”‚   โ”œโ”€โ”€ exception/             # ์ „์—ญ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ (BaseErrorCode โ†’ HTTP ๋งคํ•‘)
โ”‚   โ”œโ”€โ”€ sse/                   # SseEmitterRepository (์‹ค์‹œ๊ฐ„ ํด๋ฆญ ์ŠคํŠธ๋ฆผ)
โ”‚   โ”œโ”€โ”€ scheduler/             # ๊ณต์šฉ ์Šค์ผ€์ค„ ์„ค์ •
โ”‚   โ”œโ”€โ”€ common/                # BaseEntity (Auditing)
โ”‚   โ””โ”€โ”€ utils/                 # AESUtil, RedisUtil, CursorUtil, BudgetCalculator, MetricCalculator
โ”‚
โ””โ”€โ”€ infrastructure/client      # ์™ธ๋ถ€ ์‹œ์Šคํ…œ ์—ฐ๋™ ํด๋ผ์ด์–ธํŠธ
    โ”œโ”€โ”€ google/                # GoogleAdWebClient + converter/dto
    โ”œโ”€โ”€ meta/                  # Meta Marketing API client/config/converter/dto
    โ”œโ”€โ”€ naver/                 # Naver Search Ad API client/converter/dto
    โ”œโ”€โ”€ openai/                # Feign client + prompt + service
    โ”œโ”€โ”€ kafka/                 # KafkaClickEventProducer, ClickConsumer
    โ”œโ”€โ”€ aws/s3/                # S3 ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ
    โ”œโ”€โ”€ mail/                  # AIMailService (Thymeleaf ํ…œํ”Œ๋ฆฟ)
    โ”œโ”€โ”€ discord/               # DiscordWebhookClient
    โ””โ”€โ”€ slack/                 # SlackWebhookClient

๐Ÿ”ง CI / CD

์›Œํฌํ”Œ๋กœ ํŠธ๋ฆฌ๊ฑฐ ๋‚ด์šฉ
ci.yml push / PR โ†’ develop, main MySQLยทRedis ์„œ๋น„์Šค ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋™ โ†’ JDK 17 ์…‹์—… โ†’ ./gradlew build ๊ฒ€์ฆ
cd.yml push โ†’ develop clean build -x test โ†’ Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œยทHub ํ‘ธ์‹œ โ†’ Bastion ๊ฒฝ์œ  EC2 ๋ฐฐํฌ

๋ฐฐํฌ ์„œ๋ฒ„์—์„œ๋Š” docker-compose pull && up -d๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ต์ฒดํ•˜๊ณ , docker image prune -f๋กœ ์ž”์—ฌ ์ด๋ฏธ์ง€๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


๐Ÿค Conventions

Branch

  • feat/#1-description
  • fix/#1-description
  • refactor/#1-description
  • deploy/#1-description
  • chore/#1-description

develop์ด ๋ฐฐํฌ ๊ธฐ์ค€ ๋ธŒ๋žœ์น˜์ด๋ฉฐ, ๋ชจ๋“  ์ž‘์—…์€ ์ด์Šˆ ๋ฒˆํ˜ธ ๊ธฐ๋ฐ˜ ๋ธŒ๋žœ์น˜์—์„œ ์ง„ํ–‰ ํ›„ PR๋กœ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

Commit

Angular Commit Convention์— Gitmoji๋ฅผ ๊ฒฐํ•ฉํ•œ :gitmoji: type: subject ํ˜•์‹์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

Gitmoji Type ์„ค๋ช…
โœจ :sparkles: feat ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
๐Ÿ› :bug: fix ๋ฒ„๊ทธ ์ˆ˜์ •
๐Ÿ“ :memo: docs ๋ฌธ์„œ ์ˆ˜์ • (README, Swagger Docs ๋“ฑ)
๐ŸŽจ :art: style ํฌ๋งทํŒ…ยท๊ณต๋ฐฑ ๋“ฑ (๋™์ž‘ ๋ณ€๊ฒฝ ์—†์Œ)
โ™ป๏ธ :recycle: refactor ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง (๊ธฐ๋Šฅ ๋ณ€ํ™” ์—†์Œ)
โœ… :white_check_mark: test ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€/์ˆ˜์ •
๐Ÿ”ง :wrench: chore ๋นŒ๋“œยท์„ค์ •ยท์˜์กด์„ฑ ๋“ฑ ๊ธฐํƒ€ ๋ณ€๊ฒฝ
๐Ÿ’š :green_heart: ci CI ์„ค์ • ๋ณ€๊ฒฝ
๐Ÿš€ :rocket: deploy ๋ฐฐํฌ ๊ด€๋ จ ์ˆ˜์ • (Dockerfile, docker-compose ๋“ฑ)

Pull Request

  • PR ์ œ๋ชฉ์€ [Type/#์ด์Šˆ๋ฒˆํ˜ธ] ์ž‘์—… ์š”์•ฝ ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ: [Feat/#1] ๋กœ๊ทธ์ธ API ๊ตฌํ˜„)
  • GitHub Issue๋ฅผ ๋จผ์ € ๋“ฑ๋กํ•˜๊ณ  PR ๋ณธ๋ฌธ์— closes #์ด์Šˆ๋ฒˆํ˜ธ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌ๋ทฐ ๋ผ๋ฒจ๋กœ ๋ฐ˜์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
Label ์˜๋ฏธ ์ฒ˜๋ฆฌ
P1 ํ•„์ˆ˜ ๋ฐ˜์˜ (Critical) ๋ฐ˜์˜ ์ „ ๋จธ์ง€ ๋ถˆ๊ฐ€
P2 ์ ๊ทน ๊ถŒ์žฅ (Recommended) ๋ฐ˜์˜ ๊ถŒ์žฅ
P3 ์ œ์•ˆ (Suggestion) ์ž‘์„ฑ์ž ์ž์œจ
P4 ๋‹จ์ˆœ ํ™•์ธ (Nit) ์˜คํƒ€ยท์นญ์ฐฌ ๋“ฑ

Code Quality

  • ๋ชจ๋“  API ์‘๋‹ต์€ BaseResponse ๊ณ„์—ด ๋ž˜ํผ(DataResponse<T>, ErrorResponse)๋กœ ํ†ต์ผํ•ฉ๋‹ˆ๋‹ค.
  • ์—๋Ÿฌ๋Š” ๋„๋ฉ”์ธ๋ณ„ BaseErrorCode ๊ตฌํ˜„์ฒด๋กœ ์ •์˜ํ•˜๊ณ , ๋„๋ฉ”์ธ ์˜ˆ์™ธ๋ฅผ ๋˜์ ธ ์ „์—ญ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ HTTP๋กœ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.
  • Swagger ์–ด๋…ธํ…Œ์ด์…˜์€ presentation/docs/ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌํ•ด Controller ์ฝ”๋“œ๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์™ธ๋ถ€ ๊ด‘๊ณ  API ์ธ์ฆ์€ AdAuthFactory + AdAuthStrategy๋กœ ์ถ”์ƒํ™”ํ•ด ํ”Œ๋žซํผ ์ถ”๊ฐ€ ์‹œ ์ „๋žต๋งŒ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์™ธ๋ถ€ HTTP ํ˜ธ์ถœ์€ Feign / WebClient๋กœ ์ผ์›ํ™”ํ•˜๊ณ , ์‹คํŒจ ๊ฐ€๋Šฅ ๊ตฌ๊ฐ„์€ Spring Retry๋กœ ๊ฐ์Œ‰๋‹ˆ๋‹ค.
  • ํ† ํฐยท์‹œํฌ๋ฆฟ ๋“ฑ ๋ฏผ๊ฐ ์ •๋ณด๋Š” AESUtil๋กœ ์•”ํ˜ธํ™”ํ•ด ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชฉ๋ก ์กฐํšŒ ์‹œ ๋ฌดํ•œ ์Šคํฌ๋กค์€ CursorUtil ๊ธฐ๋ฐ˜ ์ปค์„œ ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ‘ฅ Contributors

๋ฐฑ์—”๋“œ
๋ฐฑ์—”๋“œ
๋ฐฑ์—”๋“œ

About

WhereYouAd Web Service Backend REPO

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages