Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

274 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ’œ νŒμ—…μŠ€ν† μ–΄ λͺ¨μŒ ν”Œλž«νΌ PORONG

νŒŒνŽΈν™”λœ 정보λ₯Ό ν•œκ³³μ— λͺ¨μœΌκ³ , μ‹€μ‹œκ°„ ν˜Όμž‘λ„ κ³΅μœ μ™€ κ²Œμ΄λ―Έν”ΌμΌ€μ΄μ…˜ μš”μ†Œλ₯Ό κ²°ν•©ν•œ
νŒμ—…μŠ€ν† μ–΄ 톡합 ν”Œλž«νΌ 포둱(PORONG)μž…λ‹ˆλ‹€.

image

πŸ‘₯ νŒ€μ› μ†Œκ°œ 및 μ—­ν•  λΆ„λ°°

μ „ νŒ€μ›μ΄ ν”„λ‘ νŠΈμ—”λ“œμ™€ λ°±μ—”λ“œλ₯Ό λ‹΄λ‹Ήν•˜μ—¬ κΈ°λŠ₯을 μ™„μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

μ΄μ£Όν˜„ κ³ μœ μ • μ„œμ§€ν˜„
@hana03030 @daenggg @jhwest-dev
메인 νŽ˜μ΄μ§€, μ°ΎκΈ° νŽ˜μ΄μ§€ νŒμ—… 상세, ν›„κΈ°, λ§ˆμ΄νŽ˜μ΄μ§€ 둜그인/νšŒμ›κ°€μž…, κ΄€λ¦¬μž νŽ˜μ΄μ§€
찜/리뷰 CRUD, 졜근 리뷰 API 도감/μ˜ˆμ•½ CRUD, ν˜Όμž‘λ„ API νšŒμ›/νŒμ—… CRUD, 톡계 집계 API

πŸ“Œ 기획 λ°°κ²½ 및 ν•΄κ²°μ±…

  • Pain Point: SNS에 흩어진 정보 νƒμƒ‰μ˜ 어렀움, λ°©λ¬Έ μ „ ν˜„μž₯ ν˜Όμž‘λ„ νŒŒμ•… λΆˆκ°€λŠ₯으둜 μΈν•œ μ‹œκ°„ λ‚­λΉ„
  • Our Solution:
    1. 톡합 정보 제곡: 흩어진 νŒμ—… 정보λ₯Ό ν•œκ³³μ—μ„œ μŠ€λ§ˆνŠΈν•˜κ²Œ 탐색 및 필터링
    2. μ‚¬μš©μž μ°Έμ—¬ν˜• 데이터: μœ μ €λ“€μ˜ μ‹€μ œ ν›„κΈ°λ₯Ό 기반으둜 ν•œ μ‹€μ‹œκ°„ 평균 ν˜Όμž‘λ„ 곡유
    3. κ²Œμ΄λ―Έν”ΌμΌ€μ΄μ…˜: 리뷰 μž‘μ„± μ‹œ κ·€μ—¬μš΄ 킀링 μˆ˜μ§‘ μœ λ„λ‘œ μœ μ € ν™œλ™μ„± 촉진

🌟 핡심 κΈ°λŠ₯ (Core Features)

01. μ‹€μ‹œκ°„ 인기도 및 λž­ν‚Ή μ‹œμŠ€ν…œ 02. 쑰건별 νŒμ—… 필터링
image image
μ‹€μ‹œκ°„ 찜 수 데이터λ₯Ό λΆ„μ„ν•˜μ—¬ 1~10μœ„ 인기 νŒμ—…μ„ μ§‘κ³„ν•˜κ³ , 금/은/동 μ™•κ΄€ 및 NEW 뱃지λ₯Ό μ‹œκ°ν™”ν•˜μ—¬ νŠΈλ Œλ“œλ₯Ό ν•œλˆˆμ— μ œκ³΅ν•©λ‹ˆλ‹€. μΉ΄ν…Œκ³ λ¦¬, μ§€μ—­, 운영 μƒνƒœ κ²°ν•© 필터링과 Kakao Map APIλ₯Ό μ—°λ™ν•˜μ—¬ λ‚΄ μ£Όλ³€ νŒμ—… μœ„μΉ˜λ₯Ό μ§κ΄€μ μœΌλ‘œ νƒμƒ‰ν•©λ‹ˆλ‹€.
03. μ‹€μ‹œκ°„ 별점 & ν˜Όμž‘λ„ 리뷰 04. 킀링 도감
image image
이미지 λ°”μ΄λ„ˆλ¦¬ 파일과 폼 데이터λ₯Ό λ™μ‹œμ— νŒ¨ν‚Ήν•˜μ—¬ μ „μ†‘ν•˜λ©°, 별점 및 3단계 ν˜„μž₯ ν˜Όμž‘λ„ κ²Œμ΄μ§€ μΈν„°λž™μ…˜μ„ μ§€μ›ν•©λ‹ˆλ‹€. 리뷰 μž‘μ„±μ„ 톡해 μˆ˜μ§‘ν•œ μ‚°λ¦¬μ˜€ 킀링을 λ§ˆμ΄νŽ˜μ΄μ§€μ—μ„œ ν™•μΈν•˜κ³ , λ―Ένšλ“ μ•„μ΄ν…œμ€ 그림자 μ²˜λ¦¬ν•˜μ—¬ μˆ˜μ§‘ μš•κ΅¬λ₯Ό μžκ·Ήν•©λ‹ˆλ‹€.
05. μ‹€μ‹œκ°„ μ˜ˆμ•½ 및 ν›„κΈ° λͺ¨λ‹ˆν„°λ§ 06. μžλ™ μ’Œν‘œ λ³€ν™˜ νŒμ—… 등둝
image image
μΌμžλ³„/νšŒμ°¨λ³„ νƒ€μž„ν…Œμ΄λΈ”μ— λ”°λ₯Έ μ‹€μ‹œκ°„ μ˜ˆμ•½ ν˜„ν™©μ„ νŒŒμ•…ν•˜κ³ , μœ μ €λ“€μ΄ 남긴 μƒμƒν•œ ν˜„μž₯ ν˜Όμž‘λ„ ν›„κΈ°λ₯Ό ν•œλˆˆμ— λͺ¨λ‹ˆν„°λ§ν•©λ‹ˆλ‹€. μ‹ κ·œ νŒμ—…μŠ€ν† μ–΄ 등둝 μ‹œ, μž…λ ₯ν•œ μ£Όμ†Œ 데이터λ₯Ό 기반으둜 μœ„κ²½λ„ μ’Œν‘œλ₯Ό μžλ™ λ³€ν™˜ν•˜μ—¬ Kakao Map API에 μ‹€μ‹œκ°„ 마컀둜 μ—°λ™ν•©λ‹ˆλ‹€.

πŸ› οΈ μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜ & νŽ˜μ΄μ§€ ꡬ쑰

[ μ‹œμŠ€ν…œ ꡬ쑰 ]

  • Frontend: HTML5, CSS3, JavaScript (kakaomap API 연동)
  • Backend: Spring Boot, MySQL
image

[ μ„œλΉ„μŠ€ Flow ]

  • ꡬ맀자(User): ν™ˆ(λž­ν‚Ή) ➑️ μ°ΎκΈ°(필터링) ➑️ νŒμ—… 상세(μ˜ˆμ•½/리뷰) ➑️ λ§ˆμ΄νŽ˜μ΄μ§€(킀링 도감)
  • 판맀자(Admin): νŒμ—… 관리 ➑️ νŒμ—… 등둝(μžλ™ μ’Œν‘œ λ³€ν™˜) ➑️ μ˜ˆμ•½/ν›„κΈ° 확인 및 톡계 λŒ€μ‹œλ³΄λ“œ
image

🧩 Frontend 기술적 핡심 κ΅¬ν˜„ 사항

1. μ‹œκ°μ  λͺ°μž…감을 λ†’μ΄λŠ” UI/UX 및 μΈν„°λž™μ…˜

  • 동적 이미지 뱃지 μ‹œμŠ€ν…œ: λž­ν‚Ή 데이터 μŠ€νŽ™μ— 맞좰 μ‹€μ‹œκ°„ 1, 2, 3μœ„ μƒμœ„μ— 금/은/동 μ™•κ΄€ μ˜€λ²„λ ˆμ΄λ₯Ό μ—°λ™ν•˜κ³  NEW 및 ν˜Όμž‘λ„ μ—¬μœ  뱃지λ₯Ό 쑰건뢀 λ Œλ”λ§ν–ˆμŠ΅λ‹ˆλ‹€.
  • κ°€λ‘œ 슀크둀 λ ˆμ΄μ•„μ›ƒ: μˆ˜λ§Žμ€ νŒμ—… μΉ΄λ“œκ°€ λ°°μΉ˜λ˜λŠ” 메인 λž­ν‚Ή 및 μ„Ήμ…˜μ˜ 슀크둀 μ»¨ν…Œμ΄λ„ˆλ₯Ό μ„€κ³„ν•˜μ—¬ λ§€λ„λŸ¬μš΄ λΈŒλΌμš°μ§• μΈν„°λž™μ…˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€.
  • μˆ˜ν‰ μ •λ ¬ μ΅œμ ν™”: 상세 νŽ˜μ΄μ§€ λ‚΄ νŒμ—… 일정 및 μ˜ˆμ•½ κΈ°κ°„ 데이터 μ •λ ¬ μ‹œ align-items: flex-start 및 align-items: flex-endλ₯Ό ꡬ쑰적으둜 ν™œμš©ν•˜μ—¬ 라벨과 λ‚΄μš©μ˜ ν…μŠ€νŠΈ μˆ˜ν‰ 높이 핏을 μ •κ΅ν•˜κ²Œ λ§žμ·„μŠ΅λ‹ˆλ‹€.

2. μ»΄ν¬λ„ŒνŠΈ 생λͺ…μ£ΌκΈ° 및 폼 μ œμ–΄

  • μ‹€μ‹œκ°„ 사진 λ³€κ²½/μ‚­μ œ μ—”μ§„: ν›„κΈ° μˆ˜μ • μ‹œ κΈ°μ‘΄ μ—…λ‘œλ“œ 사진 λ Œλ”λ§ ꡬ쑰λ₯Ό νƒˆν”Όν•˜κ³ , URL.createObjectURL 기반 둜컬 가상 μ£Όμ†Œ λŒ€μ²΄ 방식과 μ‚­μ œ(null) 라이프사이클을 μ—°κ²°ν–ˆμŠ΅λ‹ˆλ‹€.
  • μΈν„°λž™ν‹°λΈŒ 폼 바인딩: 마우슀 클릭에 μ—°λ™λ˜λŠ” 5단계 별점 ν™œμ„±ν™” κΈ°λŠ₯κ³Ό 3단계 μ‚¬λžŒ μ•„μ΄μ½˜μœΌλ‘œ κ΅¬μ„±λœ ν˜„μž₯ ν˜Όμž‘λ„ 선택을 κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.
  • 쑰건뢀 이미지 μŠ€μœ„μΉ­ 기법: 킀링 도감 μ‹œμŠ€ν…œ λ‚΄μ—μ„œ μ‚¬μš©μžμ˜ λ―Ένšλ“ μ•„μ΄ν…œ λͺ©λ‘μ€ 파일λͺ… κ·œμΉ™ 기반의 잠금 그림자 접두사λ₯Ό μ‘°ν•©ν•˜μ—¬ κ°„κ²°ν•œ μ½”λ“œλ‘œ μƒνƒœ λΆ„κΈ°λ₯Ό μžλ™ν™”ν–ˆμŠ΅λ‹ˆλ‹€.

πŸš€ 기술적 μ±Œλ¦°μ§€ 및 νŠΈλŸ¬λΈ”μŠˆνŒ…

1. Multipart/form-data 데이터 νŒ¨ν‚Ή ꡬ쑰 μ—λŸ¬ ν•΄κ²°

  • 문제 상황
    리뷰 μˆ˜μ • μ‹œ λ°±μ—”λ“œ μ»¨νŠΈλ‘€λŸ¬κ°€ @PatchMapping 및 consumes = MediaType.MULTIPART_FORM_DATA_VALUE둜 μ„ μ–Έλ˜μ–΄ μžˆμ—ˆμœΌλ‚˜, ν”„λ‘ νŠΈμ—”λ“œμ—μ„œ 일반 JSON λ¬Έμžμ—΄ 포맷으둜 μ†‘μ‹ ν•˜μ—¬ 415 (Unsupported Media Type) 및 405 톡신 μž₯μ• κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

  • ν•΄κ²° λ°©μ•ˆ
    κΈ°μ‘΄ JSON.stringify 전솑 ꡬ쑰λ₯Ό μ „λ©΄ νκΈ°ν•˜κ³  λΈŒλΌμš°μ € λ‚΄μž₯ 객체인 FormData λΉŒλ” ꡬ쑰λ₯Ό μ μš©ν–ˆμŠ΅λ‹ˆλ‹€. 데이터λ₯Ό κ°œλ³„ 쿼리 핏에 맞좰 μ–΄νŽœλ“œν•˜κ³ , 파일 객체(MultipartFile λ§€ν•‘μš©)λ₯Ό 단독 뢄리 νƒ‘μž¬ν–ˆμŠ΅λ‹ˆλ‹€. 특히 ν—€λ”μ˜ Content-Type을 μ˜λ„μ μœΌλ‘œ λͺ…μ‹œν•˜μ§€ μ•Šκ³  λΉ„μ›Œλ‘ μœΌλ‘œμ¨ λΈŒλΌμš°μ €κ°€ λ©€ν‹°νŒŒνŠΈ 경계선(boundary)을 μžλ™μœΌλ‘œ 인코딩 μ§€μ •ν•˜λ„λ‘ μœ λ„ν•˜μ—¬ 톡신 κ·œκ²©μ„ μ™„λ²½ν•˜κ²Œ λ™κΈ°ν™”ν–ˆμŠ΅λ‹ˆλ‹€.

2. λ°±μ—”λ“œ API 곡백에 λŒ€μ‘ν•˜λŠ” ν”„λ‘ νŠΈμ—”λ“œ 폴백(Fallback) μ•„ν‚€ν…μ²˜ 섀계

  • 문제 상황
    초기 섀계 λ‹Ήμ‹œ μˆ˜μ • νŽ˜μ΄μ§€ μ§„μž… μ‹œ ν•΄λ‹Ή ν›„κΈ°μ˜ 데이터λ₯Ό μ„œλ²„μ—μ„œ ν•œ μ€„λ§Œ κΈμ–΄μ˜€λŠ” 단건 쑰회(GET) API의 λΆ€μž¬λ‘œ 인해 κΈ°μ‘΄ μž‘μ„± 정보(Pre-fill)λ₯Ό 화면에 λ‘œλ“œν•˜μ§€ λͺ»ν•˜λŠ” 병λͺ© ν˜„μƒμ΄ μΌμ–΄λ‚¬μŠ΅λ‹ˆλ‹€.

  • ν•΄κ²° λ°©μ•ˆ
    λ°±μ—”λ“œ λ¦¬μ†ŒμŠ€λ₯Ό λ¬΄λ¦¬ν•˜κ²Œ μˆ˜μ •ν•˜λŠ” λŒ€μ‹  ν”„λ‘ νŠΈμ—”λ“œ λ‹¨μ—μ„œ λ§ˆμ΄νŽ˜μ΄μ§€ 전체 λͺ©λ‘ 쑰회 API(api/reviews/me)λ₯Ό 우회 ν˜ΈμΆœν•˜λŠ” λ°©μ–΄λ²½ μ½”λ“œλ₯Ό μ‹¬μ—ˆμŠ΅λ‹ˆλ‹€. 전체 리슀트 배열을 λ©”λͺ¨λ¦¬μ— 올린 λ’€, μ£Όμ†Œμ°½μ˜ 쿼리슀트링 νŒŒλΌλ―Έν„°(?reviewId=XX) 고유 μ‹λ³„μžμ™€ μ™„λ²½ν•˜κ²Œ μΌμΉ˜ν•˜λŠ” 객체 μš”μ†Œλ₯Ό JavaScript의 .find() λ¬Έλ²•μœΌλ‘œ μ‹€μ‹œκ°„ λ§€μΉ­Β·μ μΆœν•˜μ—¬ λ°±μ—”λ“œ μΆ”κ°€ 곡수 없이 ν™”λ©΄ 폼을 μ„±κ³΅μ μœΌλ‘œ λ³΅κ΅¬ν–ˆμŠ΅λ‹ˆλ‹€.


πŸ“‚ ν”„λ‘ νŠΈμ—”λ“œ 폴더 ꡬ쑰 (Project Structure)

Po-Rong-Frontend/
β”œβ”€β”€ assets/
β”‚   β”œβ”€β”€ css/
β”‚   β”‚   β”œβ”€β”€ global.css          # 곡톡 ν…Œλ§ˆ λ³€μˆ˜ 및 μ΄ˆκΈ°ν™” μŠ€νƒ€μΌ
β”‚   β”‚   β”œβ”€β”€ main.css            # ν™ˆ 메인 μ»΄ν¬λ„ŒνŠΈ 및 뱃지 μŠ€νƒ€μΌ
β”‚   β”‚   β”œβ”€β”€ popup-detail.css    # μ •λ ¬ ꡬ쑰가 κ°œμ„ λœ 상세 νŽ˜μ΄μ§€ μŠ€νƒ€μΌ
β”‚   β”‚   └── review.css          # ν›„κΈ° 등둝/μˆ˜μ • μ „μš© 폼 μŠ€νƒ€μΌ
β”‚   └── images/
β”‚       β”œβ”€β”€ badges/             # 금/은/동 μ™•κ΄€ 및 ν…Œλ§ˆλ³„ μƒνƒœ 뱃지
β”‚       β”œβ”€β”€ icons/              # ν•˜νŠΈ, 별점 μ±„μš°κΈ°, ν˜Όμž‘λ„ μΈν˜• μ•„μ΄μ½˜
β”‚       └── keyrings/           # νšλ“ 킀링 및 λ―Ένšλ“ shadow- 이미지 μžμ›
β”œβ”€β”€ js/
β”‚   β”œβ”€β”€ index.js                # κΈ€λ‘œλ²Œ κ°€μ΄λ“œ μ œμ–΄ 슀크립트
β”‚   β”œβ”€β”€ main.js                 # ν™ˆ λž­ν‚Ή 슀크둀 및 λ°°λ„ˆ μ œμ–΄ μ—”μ§„
β”‚   β”œβ”€β”€ popup-detail.js         # 상세 데이터 병렬 처리 및 μ˜ˆμ•½ 정보 λ§€ν•‘
β”‚   └── review-edit.js          # ν›„κΈ° μˆ˜μ • 폼 데이터 바인딩 및 파일 컨트둀러
└── pages/
    β”œβ”€β”€ explore.html            # νŒμ—… 톡합 검색 및 필터링 νŽ˜μ΄μ§€
    β”œβ”€β”€ popup-detail.html       # νŒμ—… 정보 및 ν•˜λ‹¨ κ³ μ • λ°” 상세 νŽ˜μ΄μ§€
    └── review-edit.html        # ν›„κΈ° μ‹€μ‹œκ°„ μˆ˜μ • 폼 νŽ˜μ΄μ§€

Releases

Packages

Contributors

Languages