Skip to content

devKobe24/clicksnap

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

23 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ“Έ ClickSnap - μ°°μΉ΅μ°°μΉ΅

웹캠을 μ΄μš©ν•œ 4μ»· 사진 촬영 μ„œλΉ„μŠ€

✨ μ£Όμš” κΈ°λŠ₯

  • πŸŽ₯ μ›ΉμΊ  촬영: μ‹€μ‹œκ°„ μ›ΉμΊ μœΌλ‘œ 4μž₯의 사진 연속 촬영
  • ⏱️ μΉ΄μš΄νŠΈλ‹€μš΄: 5초 μΉ΄μš΄νŠΈλ‹€μš΄μœΌλ‘œ 촬영 μ€€λΉ„ μ‹œκ°„ 제곡
  • 🎨 λ‹€μ–‘ν•œ ν•„ν„°: 11κ°€μ§€ 감성 ν•„ν„° 제곡
    • Original, Clearly, Monochrome, Sepia, Warm, Cool
    • Vintage, Fade, Milk, Film, Retro
  • πŸ–ΌοΈ 4μ»· ν•©μ„±: μ΄¬μ˜ν•œ 4μž₯의 사진을 μžλ™μœΌλ‘œ μ„Έλ‘œν˜• 슀트립으둜 ν•©μ„±
  • πŸ’Ύ 사진 μ €μž₯: μ™„μ„±λœ 4μ»· 사진을 PNG ν˜•μ‹μœΌλ‘œ λ‹€μš΄λ‘œλ“œ
  • πŸ”„ λ‹€μ‹œ 찍기: λ§ˆμŒμ— λ“€μ§€ μ•ŠμœΌλ©΄ μ–Έμ œλ“  λ‹€μ‹œ 촬영 κ°€λŠ₯

πŸ› οΈ 기술 μŠ€νƒ

Backend

  • Java 17
  • Spring Boot 3.3.5
  • Gradle 9.2.1

Frontend

  • HTML5 / CSS3
  • Vanilla JavaScript
  • Canvas API
  • MediaStream API

μ£Όμš” 라이브러리

  • Spring Boot Web
  • Spring Boot Validation
  • Lombok
  • Spring Boot DevTools

πŸ“ ν”„λ‘œμ νŠΈ ꡬ쑰

clicksnap/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ main/
β”‚   β”‚   β”œβ”€β”€ java/com/clicksnap/
β”‚   β”‚   β”‚   β”œβ”€β”€ config/
β”‚   β”‚   β”‚   β”‚   └── WebConfig.java              # CORS 및 정적 λ¦¬μ†ŒμŠ€ μ„€μ •
β”‚   β”‚   β”‚   β”œβ”€β”€ controller/
β”‚   β”‚   β”‚   β”‚   └── PhotoController.java        # 사진 μ—…λ‘œλ“œ API
β”‚   β”‚   β”‚   β”œβ”€β”€ dto/
β”‚   β”‚   β”‚   β”‚   └── PhotoResponse.java          # 응닡 DTO
β”‚   β”‚   β”‚   β”œβ”€β”€ service/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ PhotoService.java           # 사진 처리 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ StorageService.java         # 파일 μ €μž₯ μΈν„°νŽ˜μ΄μŠ€
β”‚   β”‚   β”‚   β”‚   └── FileSystemStorageService.java  # 파일 μ‹œμŠ€ν…œ μ €μž₯ κ΅¬ν˜„μ²΄
β”‚   β”‚   β”‚   └── ClicksnapApplication.java       # 메인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜
β”‚   β”‚   └── resources/
β”‚   β”‚       β”œβ”€β”€ static/
β”‚   β”‚       β”‚   β”œβ”€β”€ css/style.css               # μŠ€νƒ€μΌμ‹œνŠΈ
β”‚   β”‚       β”‚   β”œβ”€β”€ js/script.js                # 메인 JavaScript
β”‚   β”‚       β”‚   └── index.html                  # 메인 νŽ˜μ΄μ§€
β”‚   β”‚       └── application.yml                 # μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„€μ •
β”‚   └── test/
β”‚       └── java/com/clicksnap/
β”‚           └── ClicksnapApplicationTests.java
β”œβ”€β”€ build.gradle
└── README.md

πŸš€ μ„€μΉ˜ 및 μ‹€ν–‰

사전 μš”κ΅¬μ‚¬ν•­

  • Java 17 이상
  • Gradle 9.2.1 이상
  • 웹캠이 μžˆλŠ” ν™˜κ²½

1. ν”„λ‘œμ νŠΈ 클둠

git clone [repository-url]
cd clicksnap

2. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„€μ •

src/main/resources/ 디렉토리에 application-dev.yml νŒŒμΌμ„ μƒμ„±ν•˜μ„Έμš”:

file:
  upload-dir: ./uploads  # 파일 μ €μž₯ 경둜

3. λΉŒλ“œ 및 μ‹€ν–‰

# Gradle을 μ΄μš©ν•œ λΉŒλ“œ
./gradlew build

# μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰
./gradlew bootRun

4. λΈŒλΌμš°μ € 접속

http://localhost:8080

πŸ“‘ API λͺ…μ„Έ

사진 μ—…λ‘œλ“œ

사진 νŒŒμΌμ„ μ„œλ²„μ— μ—…λ‘œλ“œν•©λ‹ˆλ‹€.

Endpoint

POST /api/photos

Request

  • Content-Type: multipart/form-data
  • Parameter: image (MultipartFile)

Response

{
  "accessUrl": "/images/550e8400-e29b-41d4-a716-446655440000.png"
}

HTTP Status

  • 201 Created: μ—…λ‘œλ“œ 성곡
  • 400 Bad Request: 잘λͺ»λœ μš”μ²­

🎯 μ£Όμš” κΈ°λŠ₯ 상세

1. μ›ΉμΊ  촬영 ν”„λ‘œμ„ΈμŠ€

카메라 κΆŒν•œ μš”μ²­ β†’ 촬영 μ‹œμž‘ β†’ 5초 μΉ΄μš΄νŠΈλ‹€μš΄ β†’ 1μ»· 촬영 
β†’ 5초 μΉ΄μš΄νŠΈλ‹€μš΄ β†’ 2μ»· 촬영 β†’ ... β†’ 4μ»· μ™„λ£Œ β†’ μžλ™ ν•©μ„±

2. 사진 ν•©μ„± 규격

  • 단일 μ»·: 900 x 1200px (3:4 λΉ„μœ¨)
  • μ΅œμ’… 슀트립: 1000 x 5200px (μ„Έλ‘œν˜•)
  • 사진 μ˜μ—­: 900 x 4800px (4μ»·)
  • ν”„λ ˆμž„ μ—¬λ°±: 상/ν•˜/쒌/우 50px
  • ꡬ뢄선: 45px (검정색)

3. ν•„ν„° μ‹œμŠ€ν…œ

  • Canvas Filter API 지원 λΈŒλΌμš°μ €μ—μ„œλŠ” CSS Filter 문법 μ‚¬μš©
  • 미지원 λΈŒλΌμš°μ €μ—μ„œλŠ” ν”½μ…€ λ‹¨μœ„ 필터링 fallback 제곡
  • λͺ¨λ“  μ£Όμš” λΈŒλΌμš°μ € ν˜Έν™˜ (Chrome, Safari, Firefox, Edge)

4. 파일 μ €μž₯

  • μ €μž₯ 경둜: ./uploads (μ„€μ • κ°€λŠ₯)
  • 파일λͺ…: UUID 기반 쀑볡 λ°©μ§€
  • λ³΄μ•ˆ: Path Traversal 곡격 λ°©μ§€
  • μš©λŸ‰ μ œν•œ: μ΅œλŒ€ 10MB

πŸ”§ μ„€μ • μ˜΅μ…˜

application.yml

spring:
  servlet:
    multipart:
      max-file-size: 10MB        # 단일 파일 μ΅œλŒ€ 크기
      max-request-size: 10MB     # 전체 μš”μ²­ μ΅œλŒ€ 크기

file:
  upload-dir: ./uploads           # μ—…λ‘œλ“œ 디렉토리
  access-url-prefix: /images/     # 파일 μ ‘κ·Ό URL 접두사

CORS μ„€μ • (WebConfig.java)

.allowedOrigins("http://localhost:3000", "http://127.0.0.1:5500")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")

🎨 μ»€μŠ€ν„°λ§ˆμ΄μ§•

촬영 μ„€μ • λ³€κ²½

src/main/resources/static/js/script.jsμ—μ„œ λ‹€μŒ 값을 μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

const PHOTO_COUNT = 4;           // 촬영 맀수 (기본: 4컷)
const COUNTDOWN_SEC = 5;         // μΉ΄μš΄νŠΈλ‹€μš΄ μ‹œκ°„ (κΈ°λ³Έ: 5초)
const STRIP_BG_COLOR = "#040404ff"; // ν”„λ ˆμž„ 색상

μƒˆλ‘œμš΄ ν•„ν„° μΆ”κ°€

window.CLICKSNAP_FILTERS = {
  // ... κΈ°μ‘΄ ν•„ν„°λ“€
  custom: { 
    name: "Custom", 
    filter: "brightness(1.2) contrast(1.1)" 
  }
};

πŸ› νŠΈλŸ¬λΈ”μŠˆνŒ…

웹캠이 μž‘λ™ν•˜μ§€ μ•ŠλŠ” 경우

  • λΈŒλΌμš°μ €μ—μ„œ 카메라 κΆŒν•œμ„ ν—ˆμš©ν–ˆλŠ”μ§€ 확인
  • HTTPS ν™˜κ²½μ΄ μ•„λ‹Œ 경우 localhostμ—μ„œλ§Œ μž‘λ™

μ—…λ‘œλ“œ 파일 크기 초과

  • application.ymlμ—μ„œ max-file-size μ„€μ • 확인

CORS μ—λŸ¬ λ°œμƒ

  • WebConfig.java의 allowedOrigins에 ν”„λ‘ νŠΈμ—”λ“œ μ£Όμ†Œ μΆ”κ°€

πŸ“ 개발 정보

λΉŒλ“œ 정보

  • Group: com.clicksnap
  • Artifact: clicksnap
  • Version: 0.0.1-SNAPSHOT
  • Build File: click-snap-2.0.1.jar

λΌμ΄μ„ΌμŠ€

이 ν”„λ‘œμ νŠΈλŠ” [λΌμ΄μ„ΌμŠ€ λͺ…μ‹œ] ν•˜μ— λ°°ν¬λ©λ‹ˆλ‹€.


About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors