Skip to content

Conversation

@YuSoeun
Copy link
Member

@YuSoeun YuSoeun commented May 23, 2025

📌 Summary

Spring AI를 활용하여 사용자가 업로드한 이미지와 미션 예시 이미지 간의 유사도를 계산하고, 유사도 점수를 반환하는 로직을 구현했습니다.
해당 점수는 게시글(Board)에 저장되며, 이후 결과 평가 및 분석에 활용됩니다.


✅ Changes

  • Feature: 이미지 유사도 평가 기능 추가
  • API: /api/missions/{id}/evaluate 엔드포인트 유사도 평가 로직 구현
  • Refactor: BoardService로 유사도 비교 책임 분리
  • Fix: 게시글 생성 시 유사도 점수 응답 누락 보완

Details:

  • Spring AI 기반 이미지 임베딩 추출 및 코사인 유사도 계산 구현
  • ImageSimilarityService.compare(urlA, urlB): float 인터페이스 구현
  • webp 이미지 디코딩을 위한 라이브러리 연동
  • 게시물 평가 시 유사도 점수를 계산해 Board.similarityScore 필드에 저장
  • 유사도 점수는 0~1 사이의 float 값으로 반환되며, 소수점 4자리까지 유지
  • 테스트 코드 작성 (성공 케이스, 예외 처리 케이스 포함)
  • 유사도 평가 방식 선택을 위한 useOpenAI 파라미터 추가 및 관련 서비스 구현
  • 게시물 생성 API에서 유사도 점수가 응답에 포함되도록 수정 (유사도 계산 후 업데이트된 게시물 정보 재조회)
  • 로컬 기반 및 OpenAI Vision 기반 두 가지 유사도 계산 방식 중 선택 가능하도록 구현

🔗 Related Issue

Closes #38
Part of #37


💬 Additional Notes

  • 향후 로컬 AI 모델 서빙 또는 SageMaker로 확장할 수 있도록 구조화
  • 유사도 점수 기준에 따른 성공/실패 판단 로직은 별도 정책 이슈에서 진행 예정
  • 프론트엔드에는 변환 없이 점수 그대로 전달
  • webp, jpeg, png 등 다양한 포맷 대응을 고려하여 확장성 확보
  • 기본적으로 로컬 유사도 서비스를 사용하며, 필요에 따라 OpenAI API를 활용한 고정밀 유사도 계산 가능
  • API 호출 시 useOpenAI=true 파라미터를 통해 OpenAI 서비스 사용 가능 (기본값: false)

YuSoeun added 6 commits May 23, 2025 15:29
게시글 이미지와 미션 레퍼런스 이미지 간의 유사도 점수를 계산하고 저장하는 기능을 구현했습니다.
- `Board` 엔티티에 `similarityScore` (float, nullable) 컬럼 추가
- Flyway 마이그레이션 스크립트 작성 (`V1__add_similarity_score_to_board.sql`)
- `BoardResponseDto`에 `similarityScore` 필드 추가
- `POST /api/missions/{id}/evaluate` 엔드포인트 추가 및 서비스 로직 구현 (Spring AI 연동 부분 TODO)
- `MissionServiceTest`에 유사도 평가 테스트 케이스 추가 및 Builder 패턴 적용
- Board 엔티티에 similarityScore 필드 추가
- 이미지 유사도 평가 로직을 MissionController에서 BoardController로 이동
- Board 생성 시 자동으로 유사도 평가 수행 로직 추가
- 로컬 개발 환경을 위한 AWS 설정 환경 변수 구성
- DB 마이그레이션 스크립트 추가 (similarity_score 컬럼)
1. 이미지 유사도 계산 기능 구현
   - JImageHash 기반 유사도 서비스 구현
   - OpenAI 기반 이미지 임베딩 추출 코드 추가
   - 로컬 구현 이미지 유사도 계산 로직 구현

2. 인프라 설정 개선
   - H2 인메모리 데이터베이스 설정으로 변경
   - 데이터베이스 연결 문제 해결
   - Spring AI 의존성 충돌 해결 및 정리

3. 빈 구성 최적화
   - 중복된 @primary 어노테이션 제거
   - RestTemplate 빈 중복 정의 해결
   - 서비스 계층 의존성 주입 구조 개선

4. 보안 및 코드 품질 개선
   - .gitignore 파일 업데이트
   - 테스트 코드 수정 및 개선
   - 민감한 정보 처리 방식 개선
- evaluateImageSimilarity 메소드를 MissionService에서 BoardService로 이동
- BoardController에서 MissionService 의존성 제거 및 BoardService 사용으로 변경
- Board ID 타입을 Long에서 Integer로 통일
- 사용하지 않는 JImageHashSimilarityService 및 OpenAiImageSimilarityService 삭제
- LocalImageSimilarityService에 @primary 어노테이션 추가
- BoardServiceTest 추가 및 관련 테스트 코드 업데이트
- .gitignore에 *.sql 파일 추가
- 게시물 생성 후 이미지 유사도 계산 시 similarityScore 값이 응답에 포함되지 않는 문제 수정
- BoardController의 createBoard 메소드에서 유사도 계산 후 업데이트된 게시물 정보를 다시 조회하여 반환하도록 수정
- 이제 useOpenAI 파라미터 값에 관계없이 유사도 점수가 응답에 포함됨
@YuSoeun YuSoeun added this to the 3주차 milestone May 23, 2025
@YuSoeun YuSoeun self-assigned this May 23, 2025
@YuSoeun YuSoeun added feat 새로운 기능 추가 refactor 코드 리펙토링 labels May 23, 2025
@YuSoeun YuSoeun merged commit 6bf1757 into main May 23, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feat 새로운 기능 추가 refactor 코드 리펙토링

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Feat: JImageHash와 Spring AI 기반 이미지 유사도 평가 로직 추가

2 participants