'프로젝트' 카테고리의 다른 글
| 부동산 허위매물 프로젝트 (0) | 2025.02.21 |
|---|---|
| 국민대 무역 수입가격 예측 프로젝트 (0) | 2025.02.21 |
| 캐글 중고차 가격 예측 프로젝트 (0) | 2025.02.21 |
| 이민자 사고 데이터 분석 및 시각화 (0) | 2024.06.22 |
| 부동산 허위매물 프로젝트 (0) | 2025.02.21 |
|---|---|
| 국민대 무역 수입가격 예측 프로젝트 (0) | 2025.02.21 |
| 캐글 중고차 가격 예측 프로젝트 (0) | 2025.02.21 |
| 이민자 사고 데이터 분석 및 시각화 (0) | 2024.06.22 |
PlayBit 개발 기록 (2주)
1. 사진 인증 기능 구현
기존에는 버튼만 눌러 미션을 완료하는 방식이었지만, 실제로 목표를 수행했는지 인증할 수 있도록 사진 인증 기능을 구현하려고하고 있다
구현 내용
* 이미지 업로드 기능 추가
* 업로드한 이미지 미리보기(Preview) 구현
* 이미지 선택 및 변경 기능 구현
* 인증 완료 후 서버로 이미지 전송하는 구조 설계
* 업로드 상태(인증 중, 완료 등) UI 구성
⸻
2. 게임 실시간 동기화 개선
기존에는 새로고침을 해야만 상대방의 진행 상황이 반영되는 문제가 있었다.
이를 해결하기 위해 Short Polling 방식을 적용하였다.
구현 내용
* 게임 화면 진입 시 방 정보 조회
* 2초마다 GET API를 호출하도록 setInterval 적용
* 페이지를 벗어나면 clearInterval로 폴링 종료
* 최신 게임 상태를 자동으로 반영하도록 수정
-> 추후 다른 방식으로 변경 예정 (웹소켓? sse?)
⸻
3. 모바일 UI 개선
기존에는 데스크톱 화면 위주였던 디자인을 모바일 중심으로 수정하였다.
수정 내용
* 랜딩 페이지 전체 레이아웃 변경
* 버튼 배치 및 크기 수정
* Tic-Tac-Toe 일러스트 추가
* 게임 화면 UI 개선
* 결과 화면 버튼 단순화
* 전체적인 여백 및 타이포그래피 수정
-> 이것도 뭔가 변경될 것 같다
그리고 중간발표에서 더 확실한 모바일뷰로 변경하기를 권유 받았다
⸻
5. 프론트엔드-백엔드 API 연동
사진 인증 기능과 게임 진행 기능을 백엔드 API와 연결하기 위한 작업을 진행할 예정
⸻
이번 2주 동안은 새로운 기능을 많이 추가하기보다는 실제 서비스에서 사용할 수 있도록 완성도를 높이는 작업에 집중하였다.
특히 사진 인증 기능과 Polling 기반의 실시간 동기화는 사용자 경험을 크게 향상시키는 기능이었다. 또한 모바일 UI 개선과 API 연동을 진행하면서 프론트엔드 개발은 단순히 화면을 만드는 것이 아니라 사용자 경험과 데이터 흐름을 함께 고려해야 한다는 점을 배울 수 있었다.
다음 단계에서는 사진인증 구현한 것을 백엔드와 api연동하고, UI개선 등을 해볼 것 같다
| What I learn 3 (0) | 2026.07.27 |
|---|---|
| what i learn 2 (2) | 2026.07.13 |
| what i learn 1 (1) | 2026.06.28 |
| WEEK4 WHAT I LEARN (1) | 2026.05.21 |
| WEEK3 WHAT I LEARN (2) | 2026.05.18 |
깃헙에 이슈 올리고 확인하면 개발하고 PR
-> 다른 팀원이 검토하고 merge 하며 진행했다

1. 방 참여 페이지 / 랜딩 페이지 / 방 만들기 페이지 구현
기초적인 화면 틀을 잡았다



2. api 코드
mock data를 이용해 개발하다가 백엔드와의 연동을 위해 api 코드를 추가했다
나는 player api를 맡았다
api를 순차적으로 추가하며 백엔드와의 연결도 수시로 시도했고 성공과 실패를 반복했었다
(현재는 성공 완.)




3. 폴링 기능 추가
두 사용자간의 화면 실시간성을 어느정도 확보하기 위해 폴링 기능 코드를 추가했다.
원래는 새로고침을 해야만 상대편에서 게임을 진행했던 이력을 볼 수 있었는데 이 코드를 통해 2초마다 자동 새로고침 되어 사용자가 직접 새로고침 하지 않아도 실시간으로 게임 진행 상황을 확인 할 수 있게 되었다.


4. 화면 리디자인
페르소나에 맞춰 웹뷰가 아닌 모바일뷰로 방향을 바꾸었다. 기존의 디자인이 부자연스럽고 틱택토와의 연관성이 너무 낮아보여 우선 랜딩페이지부터 리디자인 하였다.
좀 더 게임스러워진 듯 하다




배우거나 느낀점
코드 공부를 더 해야겠다 내가 짠 코드도 복습하고 팀원이 짠 코드도 보면서 학습 해야겠다.
배포도 끝냈는데 아직 디자인이 미흡하다 그것을 고치는게 급선무 특히 게임 보드 판 ..!
MVP까지는 완성했는데 뭔가 부실해보인다
중간데모때 피드백 받아 더 완성도 높은 결과물을 만들 수 있길 ..
| what i learn 4 (1) | 2026.08.10 |
|---|---|
| what i learn 2 (2) | 2026.07.13 |
| what i learn 1 (1) | 2026.06.28 |
| WEEK4 WHAT I LEARN (1) | 2026.05.21 |
| WEEK3 WHAT I LEARN (2) | 2026.05.18 |
기획안
주제선정배경:
도파민 디톡스 및 좋은 습관 만들기
숏폼 시청습관을 고치고 좋은 습관을 들이고 싶은 사람을 위한 웹 서비스
기존 유사 서비스 분석
• A. 소셜 기반의 목표 달성 앱 (Goalify)
• 특징: 목표와 습관을 설정하고, 친구를 초 대해 공동 챌린지에 참여하는 서비스입니 다.
• 장점: 스트릭(연속 달성) 기능과 그룹 목 표를 통해 사용자에게 강한 '책임감'과 동 기를 부여합니다.
• B. 하드코어 RPG형 To-do 앱 (Habitica)
• 특징: 현실의 할 일을 완수하면 게임 캐릭 터가 성장하고, 나쁜 습관을 하면 체력이 깎이는 RPG 형태의 서비스입니다.
• 장점: 아이템 획득, 길드 시스템, 보스 클 리어 등 강력한 '게임적 요소 (Gamification)'를 통해 뚜렷한 보상감 을 제공합니다.
우리 서비스 차별점
우리는 리서치를 통해 "타인과의 상호작용(책임감) 은 살리되, 룰은 가장 단순해야 한다"는 결론을 내렸 습니다. 이에 따라 우리 서비스는 다음과 같은 차별 화된 경험을 제공합니다.
• 보드게임(틱택토) 룰 적용으로 진입 장벽 최 소화
• 복잡한 튜토리얼이나 캐릭터 육성 요소가 없습니다. 누구나 직관적으로 아는 '3x3 빙고(틱택토)' 방식을 습관 추적에 적용하 여, 유저가 고민 없이 게임을 시작할 수 있 습니다.
• 상대방과의 실시간 경쟁을 통한 재미 극대화
• 단순히 내 체크리스트를 지우는 고립된 형 태가 아닙니다. 내가 '운동 1시간 하기' 등 목표를 완수하면, 실시간으로 보드판 의 타일을 내 것(O 또는 X)으로 선점하 게 됩니다. 이 과정에서 상대방의 빙고를 막고 내가 이기기 위한 '건강한 경쟁 심 리'가 발동합니다.
플로우 차트

확정된 mvp
MVP : 두 명의 사용자가 공통의 목적을 가지고 달성을 위해 경쟁한다.
기능 :
최소 기능 :
1. 게임 할 방을 생성하기
2. 코드 입력 해서 입장하기
3. 게임 시작
3-1. 목표 등록 기능 (9개, 3X3)
3-2. 게임 활성화 기능 (뒤집기 X, 무승부 가능)
3-3. 시간 제한 (24시간)
느낀점
차차 화면 구현을 시작했는데 백과의 연결이 중요한 포인트가 될 것 같다 두려움 반 설렘반 ㅎㅎ
| what i learn 4 (1) | 2026.08.10 |
|---|---|
| What I learn 3 (0) | 2026.07.27 |
| what i learn 1 (1) | 2026.06.28 |
| WEEK4 WHAT I LEARN (1) | 2026.05.21 |
| WEEK3 WHAT I LEARN (2) | 2026.05.18 |
무작정 아이디어를 내는 것이 아니라 페르소나를 만들어보기를 중점으로 시작했다
우리의 페르소나

쇼츠에 중독된 현대인들을 대변해보자!
5-why를 통해 문제점 찾기
1. why? : 한심남은 왜 여가시간을 알차게 보내지 못했을까?
- 쇼츠에 중독되어 계속 폰만 봤기 때문이다.
2. why? : 쇼츠에 중독이 되어 폰만 봤을까?
- 습관적으로 폰을 켜서 쇼츠를 보기 때문이다.
3. why? : 왜 습관이 되었을까?
- 출퇴근시 폰을 자주보는데 이 행동이 습관으로 남았기 때문이다.
4. why? : 출퇴근시 폰으로 쇼츠를 자주 보는걸까?
- 대중교통 특성상 생산적인 일을 하긴 힘들기 때문이다.
5. why? : 왜 대중교통에서는 생산적인 일을 하기 힘들까?
- 출퇴근 시간 사람도 많고 자세도 불편하고 자주 움직이기 때문이다.
문제: 안좋은 습관이 들어버린것. 관성적으로 하던 행동들..
결론: 좋은 습관을 들이게 하는 방법은 없는걸까?
해결 방향성 생각해보기
여러가지 중 ..
누군가와 같이 할 수 있는 프로그램, 내가 해놓으면 다음에 남이 추가하고 쌓여가는 느낌 -> 틱택토
MVP 적기
MVP란?
기본적인 요구를 충족시키는 동시에, 시간과 비용을 최소화하여 시장 반응을 빠르 게 측정할 수 있는 방법을 제공합니다. MVP의 주요 목적은 제한된 자원 내에서 최대한의 가치를 창출하 고, 시장에서 제품의 가능성을 탐색하는 것
우리의 MVP
두 명의 사용자가 공통의 목적을 가지고 달성을 위해 경쟁한다.
최소 기능 :
1. 회원가입 및 닉네임 설정
2. 게임 할 방을 파는 기능
3. 게임 시작
3-1. 목표 등록 기능 (9개, 3X3)
3-2. 게임 활성화 기능 (뒤집기 X, 무승부 가능)
유저 시나리오
1. 두명의 사용자(A,B)가 회원가입을 한다.
2. 한명의 사용자(A)가 목표를 설정해 틱택토를 진행할 방을 만든다.
3. 다른 사용자(B)에게 코드 공유 및 방 입장
4. 해당 칸에 있는 행동을 하면 O 또는 X를 표시하며 게임 진행
5. 게임 결과에 따라 결과 화면 표시
배운점 및 느낀점
당장 바로 아이디어를 내고 기획에 들어가는 것이 아니라 특정 페르소나를 설계하고 거기에서부터 기획을 시작하는것이 흥미롭고 많은 깨달음이 왔다.
생각하지도 못한 경로의 아이디어들이 나와서 회의가 즐거웠다!!
MVP라는 개념은 처음 들어보았는데 근본적인 것 부터 접근할 수 있어서 부담이 줄며 실현 가능성이 높아지는 것 같아 의지가 올랐다
이 외에도 IA 등 여러 개념을 배웠다
탄탄대로가 아닐지라도 이 기획 단계를 기억하며 개발을 차근차근 나아가면 좋겠당 ..
| What I learn 3 (0) | 2026.07.27 |
|---|---|
| what i learn 2 (2) | 2026.07.13 |
| WEEK4 WHAT I LEARN (1) | 2026.05.21 |
| WEEK3 WHAT I LEARN (2) | 2026.05.18 |
| WEEK2 WHAT I LEARN (1) | 2026.05.11 |
| what i learn 2 (2) | 2026.07.13 |
|---|---|
| what i learn 1 (1) | 2026.06.28 |
| WEEK3 WHAT I LEARN (2) | 2026.05.18 |
| WEEK2 WHAT I LEARN (1) | 2026.05.11 |
| WEEK1 WHAT I LEARN (1) | 2026.05.11 |
[1] API 통신 맛보기
<API 연결 후 화면 작업>
[2] 동기/비동기 처리 학습하기
< 동기 / 비동기 처리(Promise, 콜백함수, async/await 포함) 학습하고 정리하기>
여기서 핵심은
fetch('/data/item.json')
public/data/item.json 파일을 가져오는 코드입니다.
await response.json()
가져온 JSON 데이터를 JavaScript 객체/배열로 바꿔주는 코드입니다.
기존 방식:
import { itemData } from '../data/mockData'
새 방식:
const data = await getItemData()
setItems(data)
즉 이제는 데이터를 파일에서 바로 import하는 게 아니라:
public/data/json 파일
→ fetch
→ src/apis/shopApi.js
→ 페이지 컴포넌트
→ 화면 출력


| what i learn 2 (2) | 2026.07.13 |
|---|---|
| what i learn 1 (1) | 2026.06.28 |
| WEEK4 WHAT I LEARN (1) | 2026.05.21 |
| WEEK2 WHAT I LEARN (1) | 2026.05.11 |
| WEEK1 WHAT I LEARN (1) | 2026.05.11 |
1. CSS 학습하기
HTML과 CSS는 각자의 문법을 갖는 별개의 언어이며 HTML은 CSS를 포함할 수 있다. 그러나 HTML없이 단독으로 존재하는 CSS는 의미가 없다.
리액트의 탄생 배경과 Virtual DOM


5. 느낀점!!
이제 본격적인 시작인 느낌이 들고 더 어지럽고 .... 눈물이 나온다 .....
근데 뭔가 삐걱이지만 되고있는거 같아서 뿌듯^^
ai를 쓰고 바로 복붙하지 않고 코드를 해석하면서 하고 또 하나씩 건들여보면서 감을 익히고 있다
갈길이 구만리지만 ... ..... 구만리 뚜벅뚜벅 걸으면 돼!!!!!!!!!!!!!!!!!!!!!!1
| what i learn 2 (2) | 2026.07.13 |
|---|---|
| what i learn 1 (1) | 2026.06.28 |
| WEEK4 WHAT I LEARN (1) | 2026.05.21 |
| WEEK3 WHAT I LEARN (2) | 2026.05.18 |
| WEEK1 WHAT I LEARN (1) | 2026.05.11 |
1. JS 살펴보기

| what i learn 2 (2) | 2026.07.13 |
|---|---|
| what i learn 1 (1) | 2026.06.28 |
| WEEK4 WHAT I LEARN (1) | 2026.05.21 |
| WEEK3 WHAT I LEARN (2) | 2026.05.18 |
| WEEK2 WHAT I LEARN (1) | 2026.05.11 |
[data dictionary]
ID
매물확인방식
보증금
월세
전용면적
해당층
총층
방향
방수
욕실수
주차가능여부
총주차대수
관리비
중개사무소
제공플랫폼
게재일
허위매물여부
[데이터 전처리]
결측치 있는 피처 - 전용면적(787), 해당층(229), 총층(16), 방수(16), 욕실수(18), 총주차대수(696)
결측치가 5% 미만인 총층, 방수, 욕실수는 결측치 행 삭제로 제거
총주차대수 : boxplot으로 확인 후 이상치 제거 -> 매물들의 총층을 세구간으로 나누기(1-7층/8-14층/15층~) -> 각 구간별 총 주차대수의 평균 구하기 -> 결측치가 있는 매물의 층 구간에 맞추어 평균값으로 채워넣기
df_train = df_train.drop(df_train[df_train['총주차대수'] >= 73.375].index)
df_train = df_train.assign(nclass = np.where(df_train['총층']<8, 'a',
np.where(df_train['총층']<15, 'b',
'c')))
df_train.groupby('nclass')\
.agg(mean = ('총주차대수', 'mean'))
df_train.loc[df_train['nclass'] == 'a', '총주차대수'] = df_train.loc[df_train['nclass'] == 'a', '총주차대수'].fillna(11.0)
df_train.loc[df_train['nclass'] == 'b', '총주차대수'] = df_train.loc[df_train['nclass'] == 'b', '총주차대수'].fillna(20.0)
df_train.loc[df_train['nclass'] == 'c', '총주차대수'] = df_train.loc[df_train['nclass'] == 'c', '총주차대수'].fillna(27.0)
해당층 - 같은 방식으로 각 구간의 평균값으로 결측치 채움, 해당층이 총층보다 높은 값으로 채워진 경우는 총층을 해당층으로 변경
df_train.groupby('nclass')\
.agg(mean = ('해당층', 'mean'))
df_train.loc[df_train['nclass'] == 'a', '해당층'] = df_train.loc[df_train['nclass'] == 'a', '해당층'].fillna(3.0)
df_train.loc[df_train['nclass'] == 'b', '해당층'] = df_train.loc[df_train['nclass'] == 'b', '해당층'].fillna(6.0)
df_train.loc[df_train['nclass'] == 'c', '해당층'] = df_train.loc[df_train['nclass'] == 'c', '해당층'].fillna(9.0)
df_train.loc[(df_train['총층'] < 3.0) & (df_train['해당층'] == 3.0), '해당층'] = df_train['총층']
전용면적 - 방수가 같은 매물들끼리 전용면적의 평균을 구하고 방수에 맞추어 해당 값으로 채움
df_train.groupby('방수')\
.agg(mean = ('전용면적', 'mean'))
df_train.loc[df_train['방수'] == 1.0, '전용면적'] = df_train.loc[df_train['방수'] == 1.0, '전용면적'].fillna(25.45)
df_train.loc[df_train['방수'] == 2.0, '전용면적'] = df_train.loc[df_train['방수'] == 2.0, '전용면적'].fillna(31.22)
방향, 매물확인방식, 주차가능여부 - 더미변수로 만들기
제공플랫폼- 빈도 인코딩
중개사무소 - 라벨 인코딩
게재일 - 날짜데이터로 변환 후 년, 월, 일 피처 생성
경과일 (새 피처) - 데이터셋에서 가장 최근에 올라온 매물날짜를 기준으로 각 매물들이 올라온지 얼마나 되었는지 나타내는 피처 생성
latest_date = train_encoded['게재일'].max()
train_encoded['경과일'] = (latest_date - train_encoded['게재일']).dt.days
latest_date = test_encoded['게재일'].max()
test_encoded['경과일'] = (latest_date - test_encoded['게재일']).dt.days
[모델링]
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 2. 개별 모델 정의
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
xgb_model = XGBClassifier(use_label_encoder=False, eval_metric='logloss', random_state=42)
lgb_model = LGBMClassifier(random_state=42)
# 3. 보팅 분류기 생성 (Soft Voting)
voting_clf = VotingClassifier(
estimators=[
('random_forest', rf_model),
('xgboost', xgb_model),
('lightgbm', lgb_model)
],
voting='soft'
)
# 4. 모델 학습
voting_clf.fit(X_train, y_train)| 광진구 서울형 키즈카페 위치 선정 공모전 (0) | 2026.08.21 |
|---|---|
| 국민대 무역 수입가격 예측 프로젝트 (0) | 2025.02.21 |
| 캐글 중고차 가격 예측 프로젝트 (0) | 2025.02.21 |
| 이민자 사고 데이터 분석 및 시각화 (0) | 2024.06.22 |