Full Stack Portfolio
01 / 16
React · Vue.js · Spring Boot풀스택 (+AI/데이터)

채지원
Portfolio

기획부터 배포까지 서비스 전체를 설계하고, 도메인 데이터를 코드로 연결하는 풀스택 개발자입니다.

React/Vue.js 프론트엔드와 Spring Boot 백엔드를 동시에 설계·구현하며, AWS 배포와 Redis 실시간 처리까지 서비스 전 사이클을 경험했습니다. 생명과학과 컴퓨터공학 복수전공을 바탕으로, 도메인 데이터를 서비스 로직에 연결하는 데 강점이 있습니다.
👤
프로필 사진
성격
열정가득 ENFP
이메일
ppg0226@naver.com
GitHub
github.com/jiwon0226
희망 직무
풀스택 개발자 · 백엔드 개발자
학력
경기대학교 생명과학·컴퓨터공학 복수전공 / 2020.03–2025.02
교육
KSEB 3기 · LG CNS AM Inspire Camp 1기 · SSAFY 14기 / 2023.11–2026.06
Overview
02 / 16

한눈에 보는 프로필

3개의 집중형 부트캠프와 10개 이상의 팀 프로젝트를 거치며, 단순 구현을 넘어 서비스 구조를 설계하고 문제를 수치로 해결하는 개발자로 성장했습니다. 프론트엔드 감각 위에 백엔드·인프라 경험을 더해, 기획부터 배포까지 서비스 전 사이클을 혼자서도 완성할 수 있습니다.

10+
팀 프로젝트 경험
기획부터 배포까지
3
집중형 부트캠프
웹·모바일·클라우드
대상
LG CNS Inspire Camp
최종 1위

대학생활

융합과학대학 학생회 차장 학과 2학년 대표 뮤지컬 동아리 배우·조연출 볼링·캘리그라피 동아리

핵심 강점

도메인 데이터를 코드로

주식 장 마감 시간을 폴링 로직에 반영해 일일 API 60% 감소. 생명과학 복수전공 기반 도메인 연결 사고.

FE + BE 동시 설계

버블팝업·아마겟돈·EatIt 3개 프로젝트에서 FE와 BE를 동시 담당. 데이터 흐름 전체를 설계.

설계 기여 · 아키텍처

버블팝업에서 3가지 구조 문제를 정의하고 서버 권한형 온디맨드 방안 제안·채택. 인프라 팀과 아키텍처 협업.

서비스 전 사이클

EatIt에서 기획→FE→BE→AWS EC2(Nginx, HTTPS, DNS) 전 과정 단독 완성.

시스템 경계 해결

Three.js↔React, Unity↔React, GeoJSON↔게임좌표 등 경계 문제 반복 해결.

끈기 + 주도성

복수전공생 커뮤니티 직접 생성, 학과 대표·학생회 차장 등 없으면 만드는 사고방식.

Tech Stack
03 / 16

기술 스택

JavaScript / TypeScript
중상
6개 이상 프로젝트 FE 주도. 디바운싱, IME 처리, 낙관적 업데이트, Custom Event 패턴 등 실전 최적화
React / React Native
중상
아마겟돈, 버블팝업(Three.js 3D), KEYWE(Bare RN) 등 5개 프로젝트 FE 주도
Vue.js 3
EatIt — Vue 3 + TypeScript + Pinia SPA 독립 설계·구현
Java / Spring Boot
아마겟돈(학습 API, 업적, N+1 해결), EatIt(게임 로직), 버블팝업(온디맨드 엔진)
MySQL
ERD 설계, 정규화/비정규화 의사결정, 복합키, MyBatis/JPA
Redis
중하
업적 카운터(Redis+DB 분리), 게임 실시간 구간 스냅샷 저장
Docker / AWS
중하
Docker Compose, GitHub Actions, EC2(Nginx, HTTPS, DNS), S3 Presigned URL
Hadoop / Spark
중하
뉴스 ETL, KoNLPy 형태소 분석, 트렌드 score 산출 (버블팝업)

숙련도 기준

중상주도적 개발, 코드 리뷰·최적화, 실전 패턴 적용
독립적 개발, 문서 활용하여 최적화
중하문서 참고하여 프로젝트 참여, 기본 구성 가능

기술을 다루는 방식

  • 새로운 도구를 빠르게 익히되, 사용 이유와 제약을 먼저 파악합니다.
  • 기능 구현보다 데이터 흐름과 상태 정합성을 먼저 설계합니다.
  • 문제 해결 시 원인→선택지→결정 근거를 남기는 습관이 있습니다.
  • FE·BE·인프라 사이의 번역자 역할을 자주 맡았습니다.
Git · GitHub · GitLabFigma · Jira · Notion
Education & Awards
04 / 16

교육 이수

2025.07 — 2026.06
삼성청년SW·AI아카데미(SSAFY) 14기
Java 웹 개발, Vue.js/TypeScript, AI 기초. 팀 프로젝트 3회(EatIt·아마겟돈·버블팝업). 알고리즘 A형, 이달의 동료상, CS 스터디 우수상, 빅데이터 분산 우수상.
2024.12 — 2025.06
LG CNS AM Inspire Camp 1기
MSA, Docker/Kubernetes, CI/CD, 애자일 팀 개발. 최종 프로젝트 대상(KEYWE). 미니프로젝트 비공식 1위(취업봇다리).
2023.12 — 2024.11
K-Software Empowerment BootCamp 3기 (623h)
React 기반 프론트엔드, UI/UX 설계, API 연동 실습 중심 교육.
2020.03 — 2025.02
경기대학교 생명과학+컴퓨터공학 복수전공
자료구조, 알고리즘, OS, 컴퓨터비전, 캡스톤. 복수전공생 커뮤니티 직접 생성 운영.

수상 및 성과

대상
LG CNS Inspire Camp 1기 최종 1위
A형
SSAFY 알고리즘 역량 인증
우수상
SSAFY 빅데이터 분산 프로젝트
동상×2
한국정보기술학회 논문 2편
IH
OPIc 2025.08 취득

이달의 동료상은 팀원들이 직접 선정한 수상으로, 협업 방식을 가장 잘 보여주는 증거입니다. 학습 결과를 대회·발표·문서화로 마무리해 성과로 연결해왔습니다.

Project 01 — Overview
05 / 16

버블팝업

실제 뉴스 데이터 기반 트렌드 분석이 게임 플레이에 영향을 주는 실시간 팝업스토어 경영 시뮬레이션 · SSAFY 빅데이터 분산 도메인 우수상
React 19 · TypeScript · Three.js · Spring Boot · Redis · HDFS · Spark · KoNLPy · AWS EC2/S3 · GitLab CI/CD

🏆 서버 권한형 구조 제안·채택 3D 서울 지도Unity·React 하이브리드Spark ETL
FE 기여 50%
3D 서울 지도(V1→V3), Unity 오버레이 게임 UI, 랜딩·대시보드, 인증(Zustand+토큰 갱신)
BE 기여 50%
구간 기반 온디맨드 계산, 시즌 시작/종료, 스케줄러 분리, 외부 API 배치+캐시+fallback
기획·설계 기여
3가지 구조 문제 정의 → 온디맨드 서버 권한형 방안 제안·채택 → 인프라 팀과 아키텍처 협업
팀 구성
6인 (풀스택 5 + 인프라·Unity 1) / 2026.03~04
GeoJSON Douglas-Peucker로 좌표 60% 감소. 게임 동기화·위변조 문제를 해결하는 구조적 방안을 내가 제안하고 팀이 채택했습니다.
서비스 대표 화면
게임 UI 화면
Project 01 — Frontend
06 / 16

3D 서울 지도 — V1 → V2 → V3 진화

  • V1 (수동 좌표): 8개 구역 꼭짓점을 직접 입력. 빠른 프로토타입이었지만 정확도 낮음.
  • V2 (공유 꼭짓점): 인접 구역이 경계를 공유하도록 개선. 틈새·겹침 해결.
  • V3 (공공 GeoJSON): 서울시 공공 GeoJSON 직접 가공. Douglas-Peucker로 좌표 포인트 60% 감소. 한강 메시 별도 생성.

Unity + React 하이브리드 UI

  • 레이어 구조: Unity 3D 배경 위에 React bg-transparent 오버레이. z-index 충돌 문제 직접 해결.
  • 5개 액션 모달: 발주·가격·홍보·인플루언서·이벤트. ModalWrapper 공통화로 일관된 진입/퇴장 애니메이션.

인증 — Zustand + failedQueue

  • 401 응답 시 failedQueue 패턴으로 동시 갱신 요청 처리. 토큰 갱신 도중 들어온 요청을 큐에 보관, 갱신 완료 후 일괄 재전송. 무한루프 방지 로직 별도 구현.
V1 & V2 (수동 좌표 → 공유 꼭짓점)
V3 (GeoJSON)
Unity 오버레이 게임 UI
"대부분의 문제가 두 시스템의 경계에서 발생했다. Three.js↔React DOM, GeoJSON↔게임좌표계, Unity↔React 레이어. 경계를 분석하는 능력이 풀스택 개발자의 핵심."
Project 01 — Architecture Decision
07 / 16

설계 기여 — 구조 문제 정의 & 방안 제안

팀이 직면한 3가지 구조적 문제

  • 시즌 로그 과부하: 게임 1회당 1만+ 건 이상 로그 → RDB 직접 저장 시 부하
  • FE-BE 동기화 불일치: 일정 주기 동기화 사이 발생한 상태 변화를 어떻게 반영할 것인가
  • 클라이언트 위변조: localStorage 재고·잔액 → 개발자 도구로 수정 가능 → 공정성 붕괴
방안 1
전체 파이프라인형
Redis + Kafka + Spark 상시 파이프라인. 모든 틱을 이벤트로 처리.
복잡도 과도 — 미채택
방안 2 — 채택 · 내 제안
온디맨드 구간 계산
서버 권한형. 평상시 계산 없음. 액션/이벤트/재접속 시점에만 구간 계산. 시드로 재현 가능.
채택 — 팀 전체 동의
방안 3
Zustand + 스냅샷형
클라이언트 메모리 계산 + localStorage 스냅샷 + 서버 승인.
위변조 잔존 — 미채택

방안 2 — 5가지 서버 개입 타이밍

타이밍서버가 하는 일
영업 준비hourlySchedule·시드·이벤트 스케줄 전달. Redis 초기값 저장.
액션 발생마지막 저장~현재까지 구간 계산. 유입률/판매가 변경. Redis 스냅샷 추가.
재접속Redis 이력으로 현재 시점까지 온디맨드 계산 → 완벽 복원.
영업 마감최종 구간 계산. 정산. MySQL 저장. Kafka 발행.
BE ERD
전체 아키텍처 다이어그램

시드(Seed) 방식 — 재현 가능한 랜덤성

손님 구매량(0~3개)을 그때그때 Math.random()으로 결정하면 서버 검증 불가 + 재접속 복원 불가. 시즌 시작 전 서버가 유저별 시드 배정. 서버·FE가 같은 시드를 순서대로 소모 → 어느 쪽에서 계산해도 동일한 결과. SSE 없이도 클라이언트가 이벤트 스케줄을 들고 있다가 시각이 되면 서버에 직접 요청.

이 방안 채택 후 인프라 역할자와 Redis 이력 구조 및 Kafka 연동 방식을 함께 설계했습니다.
Project 01 — Backend Implementation
08 / 16

BE 구현 상세

① 스케줄러 기능 분리

  • GameTickScheduler (10초): 실시간 상태 조회·브로드캐스트만 담당. 계산 로직 없음.
  • SeasonDayClosingScheduler: 하루 마감 처리 전담 — 최종 구간 계산, MySQL 정산 저장, Kafka 발행. 관심사를 명확히 분리해 유지보수성 향상.

② Redis 이력 구조 (구간 스냅샷)

유입률·판매가·유동인구배수가 바뀌는 순간마다 스냅샷을 Redis에 누적. 이 이력만 있으면 어느 시점에서든 잔액·재고를 독립 재계산 가능.

{ 시각:"10:00", 유입률:0.147, 판매가:4000, 유동인구배수:1.1, 시드위치:0 }
{ 시각:"12:30", 유입률:0.396, 판매가:3200, 유동인구배수:1.1, 시드위치:38 }
{ 시각:"14:00", 유입률:0.475, 판매가:3200, 유동인구배수:1.265, 시드위치:74 }

③ 외부 API 배치 + 캐시 + fallback

  • 뉴스·유동인구 외부 API 호출은 배치로 처리해 부하 분산.
  • Redis 캐시로 중복 호출 방지. fallback: API 실패 시 이전 캐시 데이터 사용.

트러블슈팅 — Spark ETL 스케일 불일치

PROBLEM

게임 내 손님 수가 계속 0으로 산출됨. 매출이 발생하지 않아 게임 정상 진행 불가.

ROOT CAUSE

Spark ETL이 유동인구 원본 데이터를 0~20 score로 정규화했는데, BE 손님 수 계산식은 수천 단위의 실제 수치를 전제로 설계됨. 두 시스템의 scale이 불일치.

SOLUTION

10초 틱 로그에 customerCount·cash·totalStock 추가해 원인 추적. Spark score 범위(0~20) 기준으로 손님 수 계산식 전면 재설계. 손님 수 0 → 정상 범위 산출, 매출 정상 발생.

Project 02 — Overview
09 / 16

아마Get돈

20~30대 초보 투자자를 위한 투자 성향 기반 맞춤 학습 + 모의투자 금융 학습 플랫폼
React 18 · TypeScript · lightweight-charts · Spring Boot 3 · JPA · Redis · FastAPI

FE 60% + BE 40% 동시N+1 해결 98%↓API 호출 60%↓업적 시스템
FE 기여 60%
투자 페이지(캔들차트·매매UI·관심종목), 학습·업적·성향분석, 헤더(Custom Event), 라우팅 가드
BE 기여 40%
학습 로드맵(복합키+순차잠금+N+1 해결), 업적 시스템(Redis+상수 클래스), FastAPI 프록시
도메인 배경
금융을 몰랐기 때문에 선택. 주식 장 마감 시간을 코드에 반영 → 불필요 API 60% 제거
팀 구성
6인 (FE 2, BE 3, INFRA 1) / 2026.01~02
N+1 해결 DB 쿼리 ~100회 → 2회(98%↓). 장 마감 폴링 자동 중단으로 일일 API ~50,000건 → ~20,000건(60%↓).
캔들차트 + 매매 UI
학습 · 업적 화면
Project 02 — Frontend
10 / 16

FE 핵심 구현 6가지

① 실시간 캔들차트

lightweight-charts 기반 주식 시세 시각화. 컴포넌트별 폴링 주기 분리 — 실시간 1초, 내종목 7초, 차트 6분.

② usePolling + isMarketOpen()

평일 09:00~15:30 체크 함수. 장 마감 후 폴링 자동 중단 → 일일 ~50,000건 → ~20,000건(60%↓). 도메인 규칙이 코드를 설명.

③ 낙관적 업데이트 (관심종목)

클릭 즉시 UI 반영, 서버 실패 시 rollback. UX 지연 없음.

④ Custom Event (헤더 동기화)

닉네임·성향 변경 시 window.dispatchEvent. 전역 상태 대신 느슨한 결합 선택.

⑤ 라우팅 가드 3종

Private(로그인), Public(비로그인), Survey(성향 미완료). 서비스 접근 제어 전 체계 설계.

⑥ FastAPI AI 프록시 연동

성향 분석 AI를 BE 경유하는 프록시 구조. 클라이언트가 FastAPI 직접 호출 안 함.

투자 페이지 전체 화면
학습 · 성향분석 화면
"도메인 지식(주식 장 마감 시간)을 코드에 직접 반영하는 것이 실질적 성능 개선으로 이어진다는 것을 체감했습니다."
Project 02 — Backend
11 / 16

BE 핵심 의사결정 4가지

① N+1 해결 — Bulk Fetch + Memory Mapping

챕터별 진행 내역 조회 시 JPA N+1 발생. 전체 진행 내역을 한 번에 조회 후 Map 변환, 루프에서 O(1) 조회.

항목BeforeAfter
DB 쿼리 수~100회 (챕터 수 비례)2회 (고정)

② 복합키 + 순차 잠금 알고리즘

user_id + chapter_id 복합키. 소규모에서 가시성 우선 → 내부 static class 선택. prevCompleted 플래그 기반 순차 잠금 해제 — 파생 상태를 저장하지 않고 매 요청마다 실시간 계산. "파생 데이터는 계산이 정합성에 유리하다" 체득.

③ 업적 시스템 — Redis + 상수 클래스

빈번한 카운터 → Redis. 영구 기록 → DB. AchievementIdCode 상수 클래스로 하드코딩 제거. 행동 시점에만 체크하는 이벤트 기반 설계.

④ FastAPI 프록시 구조

Python 기반 AI를 독립 서비스로 운영. Spring Boot BE를 경유하는 프록시 구조 → 아키텍처 일관성 유지.

시스템 아키텍처 다이어그램
ERD (DB 설계도)
Project 03 — Overview
12 / 16

EatIt

SSAFY 교육생에게 식단 관리와 CS 학습을 게이미피케이션으로 연결해 학습 지속성을 높이는 서비스
Vue.js 3 · TypeScript · Pinia / Spring Boot · MyBatis / AWS EC2 · Nginx · Let's Encrypt

2인팀 중도 합류FE 90% 단독 AWS 배포 100% 단독BE 40%
기획 기여
HP 비례 XP 공식 직접 설계. CS 컨텐츠 스토리텔링 기획("스택/큐 = 설거지 접시", "TCP = 배달앱 주문") + SQL INSERT 직접 작성
FE (90%)
전체 화면 구현, API 연동, FoodSearch UX(디바운싱+IME+스켈레톤), 라우팅
BE (40%)
HP/XP 게임 로직, gainedHp rollback 구조, 코드 UPSERT
인프라 (100%)
AWS EC2 배포 전 과정 단독 — Nginx 리버스 프록시, Let's Encrypt HTTPS, DNS, 세션 쿠키 문제 해결
87점 획득(1위 92점). 중도 합류 상황에서 기획·FE·BE·AWS 배포까지 2인팀 내 대부분을 단독 담당.
메인 화면
CS 학습 · 식단 화면
Project 03 — Tech Deep Dive
13 / 16

설계 의사결정 3가지

① HP 비례 XP 공식 — 게임 루프 설계

식단 등록 안 하면 HP가 줄고, HP가 낮을수록 XP도 줄어드는 구조. 학습보다 식단 등록을 먼저 유도하는 게임 루프.

XP = 20 + (현재HP × 0.2)
HP 100 → 40XP  ·  HP 50 → 30XP  ·  HP 0 → 20XP
HP < 10 → 학습 불가 (식단 등록 유도)

② gainedHp rollback — source of truth 설계

식단 삭제 시 HP를 얼마나 되돌릴 것인가. 등록 당시 실제로 회복된 양을 저장해야 정합성 보장.

actualGain = min(회복량, 100 - currentHP_at_registration)
삭제 시: currentHP -= actualGain  →  정확한 복원

"source of truth를 동작 시점의 실제값으로 채워야 한다" — 이 설계에서 체득한 원칙.

③ FoodSearch UX 최적화 3가지

  • 디바운싱(300ms): 타이핑마다 API 호출 방지.
  • 한글 IME 처리: compositionstart/end 이벤트로 조합 중인 글자를 검색어로 전송 방지.
  • 스켈레톤 최소 노출: 결과가 빠르면 스켈레톤 깜빡임 없이 바로 렌더.

트러블슈팅 — HTTPS 전환 후 세션 쿠키 차단

PROBLEM

로그인 후 모든 API에서 403 반환. 서비스 전체 사용 불가.

ROOT CAUSE

HTTP → HTTPS 전환 후 브라우저 SameSite/Secure 정책으로 세션 쿠키 자동 차단. Spring Boot 기본 설정이 HTTPS 환경을 인식하지 못해 Secure 플래그 없이 쿠키 발행.

SOLUTION

application.propertiessecure=true, same-site=none, forward-headers-strategy=native 추가. Nginx 프록시 헤더가 Spring에 전달되도록 설정. 전체 API 403 → 정상 응답.

XP 공식 흐름
식단 등록
HP 회복 (actualGain = min(회복량, 100−HP))
학습 시도
HP ≥ 10 확인 → XP = 20 + (HP × 0.2) 지급
HP < 10
학습 차단 → 식단 등록 유도 메시지
"운영 환경(HTTPS, 세션 쿠키, DNS)을 직접 경험해야 서비스 전체 흐름을 이해할 수 있다는 것을 확인했습니다."
Project 04 — Overview
14 / 16

KEYWE

DID 기반 병원 통합 출입증 모바일 앱 · React Native (Bare) · Zustand · FCM · Credo
LG CNS AM Inspire Camp 1기 최종 프로젝트 대상(1위)

🏆 대상 수상 (1위) Bare RN 마이그레이션 주도DID 신기술
핵심 역할
UI/UX 설계, 출입증·알림·마이페이지 구현, Bare RN 마이그레이션 주도
기술 선택 근거
Credo(DID) 라이브러리가 네이티브 모듈 직접 접근 필요 → Expo SDK 네이티브 링킹 차단 확인 → Bare Workflow 전환. 스타일이 아닌 라이브러리 제약에서 출발한 판단.
팀 구성
8인 (FE 웹 2, FE 앱 2, BE 3, INFRA 1) / 2025.04~06
성능 결과
JMeter 부하 테스트 기준 평균 응답속도 103ms · 에러율 0.01%
Expo 제약을 직접 분석하고 Bare RN으로 전환을 주도했습니다. 단순 기술 채택이 아니라 제약 조건을 먼저 파악하고 판단하는 방식으로 접근했습니다.
앱 주요 화면
출입증 Flip 애니메이션
Project 04 — Troubleshooting 6건
15 / 16

실사용 기반 트러블슈팅 — 6건

1
FCM 알림 미갱신
문제앱이 백그라운드 → 포그라운드로 복귀해도 알림 목록이 갱신되지 않음. 새 알림이 도착해도 화면에 표시 안 됨.
원인React Native AppState 이벤트를 구독하지 않아 전환 시 재조회 트리거가 없었음.
해결AppState 이벤트 리스너 등록 + 포그라운드 진입 시 알림 목록 재조회 API 자동 호출.
2
배지 카운트 동기화 불일치
문제알림을 읽어도 상단 배지 숫자가 줄지 않음. 사용자 입장에서 읽음 처리가 적용 안 된 것처럼 보임.
원인읽음 처리 후 로컬 상태만 변경하고 서버 전체 미읽음 수를 재조회하지 않아 불일치 발생.
해결읽음 처리 API 응답 콜백에서 전체 미읽음 수 재조회 추가. 서버 숫자를 단일 source of truth로 유지.
3
로그인 유지 실패
문제앱 재실행 시 로그인 상태가 사라지고 매번 다시 로그인 요구. 사용자 불편 심각.
원인AsyncStorage에 저장한 토큰이 앱 업데이트나 캐시 정리 시 삭제됨. 보안 저장소 미사용.
해결react-native-keychain(SecureStore) 기반 토큰 영속화. 앱 실행 시 유효성 검사 후 자동 로그인.
4
인증 모달 중복 표시
문제여러 API가 동시에 401 반환 시 인증 갱신 모달이 여러 번 표시되어 화면이 불안정해짐.
원인각 API 응답 인터셉터가 독립적으로 모달 트리거. 동시 401이 들어오면 N번 실행됨.
해결전역 isRefreshing 플래그 + failedQueue 패턴. 갱신 중 후속 요청을 큐에 보관, 완료 후 일괄 처리.
5
Bare RN 네이티브 모듈 충돌
문제Credo 라이브러리 설치 후 Android 빌드 실패. 다른 라이브러리와의 충돌로 앱 실행 불가.
원인자동 링킹이 다른 네이티브 모듈과 충돌. 패키지 버전 불일치로 ABI 호환 문제 발생.
해결package.json 의존성 버전 고정 + react-native.config.js에 링킹 대상 수동 명시로 충돌 해소.
6
출입증 Flip 애니메이션 버벅임
문제Android에서 출입증 카드 뒤집기 3D 애니메이션이 끊기고 프레임 드롭 발생.
원인Animated가 JS Thread에서 처리되어 UI Thread를 블로킹. rotateY 범위가 최적화되지 않음.
해결useNativeDriver:true 설정으로 Native Thread 분리. rotateY interpolate 범위(0→180도) 명확히 지정.
Closing
16 / 16
감사합니다채지원

도메인 데이터를
코드로 연결하는

기획부터 배포까지 서비스 전체를 설계하고, 도메인 데이터를 서비스 로직에 연결하는 풀스택 개발자입니다. FE-BE 경계를 직접 설계하고, 어려운 문제를 수치로 풀어내며, 구조적 문제를 팀에 제안할 수 있는 개발자입니다.

기술을 배우는 속도보다, 문제를 끝까지 붙드는 힘으로 증명하겠습니다.

Contact

이메일
ppg0226@naver.com
GitHub
github.com/jiwon0226
ReactVue.js Spring Boot풀스택AI/데이터