Skip to content

feat: 1:1 inquiry, guide admin, image storage, bilingual search#115

Open
imhyunho99 wants to merge 2 commits into
MobileOnz:devfrom
imhyunho99:feat/inquiry-guide-image-bilingual-search
Open

feat: 1:1 inquiry, guide admin, image storage, bilingual search#115
imhyunho99 wants to merge 2 commits into
MobileOnz:devfrom
imhyunho99:feat/inquiry-guide-image-bilingual-search

Conversation

@imhyunho99

Copy link
Copy Markdown

feat: 1:1 inquiry, guide admin, image storage, bilingual search

Summary

이번 세션에서 백엔드에 추가/수정된 4개 트랙을 한 번에 정리한 PR.

  1. 1:1 문의 (Inquiry) 풀스택 신규 구현
  2. 칵테일 가이드 (Guide) admin CRUD
  3. 이미지 저장 추상화 (S3 / 로컬 파일 모드)
  4. 영문 검색 버그 수정 (bilingual search)

추가로 운영 편의를 위한 admin UI 라우팅 복구 + 환경 분리(local/docker/prod 프로파일) + 이미지 최적화 파이프라인 코드도 포함.


변경 통계

17 files changed, 164 insertions(+), 31 deletions(-)
+ 11 new files / directories

주요 변경

1. 1:1 문의 기능

파일 역할
domain/inquiry/entity/Inquiry.java, InquiryStatus.java JPA 엔티티 + NEW/READ/REPLIED enum
domain/inquiry/repository/InquiryRepository.java Spring Data + paged queries
domain/inquiry/service/InquiryService.java 비즈니스 로직 (소유자/admin 권한 분리)
domain/inquiry/controller/InquiryController.java POST /api/v2/inquiry, GET /mine, GET /{id}
domain/inquiry/dto/request/InquiryCreateReq.java snake_case 검증 DTO
domain/inquiry/dto/response/InquiryRes.java, InquiryPageRes.java, InquiryCreateRes.java 응답 모델
domain/admin/controller/AdminInquiryController.java /admin/inquiries Thymeleaf + 상태/메모 편집
templates/admin/inquiries.html, inquiry-detail.html 운영 화면

DB에 inquiry 테이블 자동 생성 (ddl-auto=update). 비로그인은 device_number로, 로그인은 JWT로 인입.

2. 가이드 (Guide) Admin CRUD

파일 역할
domain/admin/service/AdminGuideService.java 가이드/섹션 CRUD + 순서 변경 트랜잭션
domain/admin/controller/AdminGuideController.java 뷰 + AJAX 12개 엔드포인트
domain/cocktail/repository/GuideDetailRepository.java 누락된 섹션 리포지토리
templates/admin/guides.html, guide/edit.html 운영 화면 (드래그 정렬, 섹션 추가/삭제)
templates/admin/dashboard.html "📚 가이드 관리" 메뉴 추가

UNIQUE(guide_part, display_order) 제약 회피하는 2-phase reorder 트랜잭션 포함.

3. 이미지 저장 추상화

파일 역할
common/storage/ImageStorage.java 인터페이스 (upload/delete/mode)
common/storage/LocalFileImageStorage.java 파일시스템 저장 + path traversal 방어
common/storage/S3ImageStorage.java AWS SDK v2 PutObject/DeleteObject
common/storage/ImageStorageConfig.java aws.s3.access-key 유무로 자동 모드 선택
common/storage/StaticUploadsWebConfig.java /uploads/** ResourceHandler
domain/admin/controller/AdminAjaxController.java 칵테일 이미지 업로드 → ImageStorage 위임

로컬 개발: ./uploads에 저장 → http://127.0.0.1/onz/uploads/...로 서빙
운영: AWS 키 주입 즉시 자동으로 S3 모드 전환 (코드 변경 0줄)

4. 영문 검색 버그 수정

  • CocktailRepositoryImpl#nameContainsBilingual 추가: kor/eng 컬럼 OR + case-insensitive
  • CocktailService#getCocktailSuggestions: 양 언어 contains 매칭으로 변경
  • CocktailRepository: findTop5SuggestionsBilingual 네이티브 쿼리 추가

이전엔 kor_name AND eng_name AND 매칭이라 둘 중 한쪽만 매칭하면 0건 반환.

5. 부수 변경

  • Cocktail 엔티티에 image variant 컬럼 4개 추가 (image_url_thumb/detail, glass_image_url_thumb/detail)
  • CocktailResponseDto, CocktailDetailResponseDto에도 4개 필드 노출
  • 이미지 최적화 CLI (tools/imagepipeline/) — --image-pipeline 플래그로 105장 일괄 WebP 변환
  • application-local.yml, application-docker.yml 환경 분리 (평문 패스워드 0)
  • JWTFilter에 inquiry 인증 패턴 등록
  • AdminViewController 신규 — 그동안 /admin/login, /admin/dashboard 컨트롤러 누락으로 admin UI 자체가 404였던 이슈 복구
  • .gitignoreuploads/ 추가

보안 점검

  • .env, .env.* 모두 .gitignore에 등재됨
  • application-*.yml 모두 환경변수 참조만 사용 (평문 secret 없음)
  • ✅ 소스 코드 안 AWS/JWT/Apple 키 하드코딩 0건
  • ⚠️ SecurityConfig.java:110의 admin/admin1!은 기존부터 default — 추후 ${ADMIN_PASSWORD} 환경변수화 권장

테스트 / 검증

  • 양 백엔드 (Java/Node) 동일 contract로 inquiry/검색 동작 — Java 본 PR이 1차, Node는 동기화 별도 진행
  • 영문 검색: Whiskey → 위스키 사워 매칭 OK
  • 한글 검색: 위스키 → 위스키 사워 매칭 OK
  • 이미지 업로드 (로컬 모드): multipart → 파일시스템 저장 → URL 반환 → 서빙 200 → 삭제 OK
  • Admin 페이지: 로그인 후 모든 메뉴 (칵테일/가이드/태그/문의) 200 응답

후속 (이 PR 이후)

  • AWS S3 키 주입 → 환경변수 두 줄 추가로 자동 S3 모드 전환
  • 이미지 파이프라인 실행으로 105장 일괄 WebP 변환 (스토리/배포에서 95% 데이터 절감 검증됨)
  • admin 비밀번호 환경변수화

🤖 Generated with Claude Code

imhyunho99 and others added 2 commits April 22, 2026 19:45
- 1:1 문의 풀스택: entity/repo/service + REST + admin Thymeleaf
- 가이드 admin CRUD: 12 endpoints + reorder transaction + dashboard menu
- 이미지 스토리지 추상화: LocalFile / S3 자동 전환 (AWS 키 유무로)
- 영문 검색 버그 수정: kor_name AND eng_name → OR + case-insensitive
- 이미지 variant 컬럼 4개 + 응답 DTO 노출
- 이미지 최적화 CLI (--image-pipeline) — WebP 변환, dry-run 가능
- 환경 분리: application-local/docker/prod 평문 secret 제거
- AdminViewController 신규 (admin UI 라우팅 복구)
- uploads/ .gitignore 추가

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@imhyunho99 imhyunho99 requested a review from Leesowon April 25, 2026 09:12
@Leesowon

Copy link
Copy Markdown
Contributor

확인 했습니다!
그러면 해당 pr을 통해 /admin 웹페이지에서

  1. 이미지 업로드 -> aws s3 등록 및 관리
  2. 칵테일에 대한 수정, 삭제, 카테고리 관리 등
    이 가능하고, 앱에서 영어 검색 기능까지 구현된 건가요??

@imhyunho99

Copy link
Copy Markdown
Author

넵 로컬에서 돌려보시면 아시겠지만 대시보드로 어디많이 들어갔는지도 파악 되고요. 1:1문의랑 이런거 정상화도 시켰고 회원 탈퇴도 만들어 놨어요. 근데 이슈가 있는게

  1. S3 key가 없어서 자동으로 S3 업데이트해서 webp 최적화가 안돼요
  2. 지금 프론트에서 앤드포인트 없는것들이 몇개 있어서 추가했는데 그건 앱 재심사 대상이에요

레포 프론트/백 다운로드 받고 클로드한테 에뮬레이터 켜서 내가 테스트해볼 수 있게 해달라고 하면 시켜줄거에요. admin url도 알려줄거고요

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants