member preferences serviceimpl add

This commit is contained in:
youbeen 2025-06-17 09:21:11 +09:00
parent 5c8100ee02
commit ab21ae49e1
4 changed files with 164 additions and 2 deletions

BIN
dump.rdb Normal file

Binary file not shown.

View File

@ -0,0 +1,48 @@
// member/src/main/java/com/ktds/hi/member/repository/jpa/TagRepository.java
package com.ktds.hi.member.repository.jpa;
import com.ktds.hi.member.repository.entity.TagEntity;
import com.ktds.hi.member.repository.entity.TagCategory;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
/**
* 태그 정보 JPA 리포지토리 인터페이스
* 태그 정보 데이터의 CRUD 작업을 담당
*/
@Repository
public interface TagRepository extends JpaRepository<TagEntity, Long> {
/**
* 태그명 목록으로 활성 태그 조회
*/
List<TagEntity> findByTagNameInAndIsActiveTrue(List<String> tagNames);
/**
* 활성 태그 전체 조회 (카테고리, 정렬순서별 정렬)
*/
List<TagEntity> findByIsActiveTrueOrderByTagCategoryAscSortOrderAsc();
/**
* 카테고리별 활성 태그 조회 (정렬순서별 정렬)
*/
List<TagEntity> findByTagCategoryAndIsActiveTrueOrderBySortOrderAsc(TagCategory tagCategory);
/**
* 태그명으로 태그 조회
*/
Optional<TagEntity> findByTagNameAndIsActiveTrue(String tagName);
/**
* 카테고리별 태그 개수 조회
*/
Long countByTagCategoryAndIsActiveTrue(TagCategory tagCategory);
/**
* 활성 태그 존재 여부 확인
*/
boolean existsByTagNameAndIsActiveTrue(String tagName);
}

View File

@ -0,0 +1,116 @@
// member/src/main/java/com/ktds/hi/member/service/PreferenceServiceImpl.java
package com.ktds.hi.member.service;
import com.ktds.hi.member.dto.PreferenceRequest;
import com.ktds.hi.member.dto.TasteTagResponse;
import com.ktds.hi.member.domain.TagType;
import com.ktds.hi.member.repository.entity.PreferenceEntity;
import com.ktds.hi.member.repository.entity.TagEntity;
import com.ktds.hi.member.repository.entity.TagCategory;
import com.ktds.hi.member.repository.jpa.PreferenceRepository;
import com.ktds.hi.member.repository.jpa.TagRepository;
import com.ktds.hi.common.exception.BusinessException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.stream.Collectors;
/**
* 취향 관리 서비스 구현체
* 취향 정보 등록/수정 태그 관리 기능을 구현
*/
@Service
@RequiredArgsConstructor
@Slf4j
@Transactional
public class PreferenceServiceImpl implements PreferenceService {
private final PreferenceRepository preferenceRepository;
private final TagRepository tagRepository;
@Override
public void savePreference(Long memberId, PreferenceRequest request) {
// 태그 유효성 검증
List<TagEntity> existingTags = tagRepository.findByTagNameInAndIsActiveTrue(request.getTags());
if (existingTags.size() != request.getTags().size()) {
throw new BusinessException("유효하지 않은 태그가 포함되어 있습니다");
}
// 기존 취향 정보 조회
PreferenceEntity preference = preferenceRepository.findByMemberId(memberId)
.orElse(null);
if (preference != null) {
// 기존 정보 업데이트
preference.updatePreference(request.getTags(), request.getHealthInfo(), request.getSpicyLevel());
} else {
// 새로운 취향 정보 생성
preference = PreferenceEntity.builder()
.memberId(memberId)
.tags(request.getTags())
.healthInfo(request.getHealthInfo())
.spicyLevel(request.getSpicyLevel())
.build();
}
preferenceRepository.save(preference);
log.info("취향 정보 저장 완료: memberId={}, tags={}", memberId, request.getTags());
}
@Override
@Transactional(readOnly = true)
public List<TasteTagResponse> getAvailableTags() {
List<TagEntity> tags = tagRepository.findByIsActiveTrueOrderByTagCategoryAscSortOrderAsc();
return tags.stream()
.map(tag -> TasteTagResponse.builder()
.id(tag.getId())
.tagName(tag.getTagName())
.tagType(convertTagCategoryToTagType(tag.getTagCategory()))
.description(tag.getTagCategory().getDescription())
.build())
.collect(Collectors.toList());
}
@Override
@Transactional(readOnly = true)
public List<TasteTagResponse> getTagsByType(TagType tagType) {
TagCategory tagCategory = convertTagTypeToTagCategory(tagType);
List<TagEntity> tags = tagRepository.findByTagCategoryAndIsActiveTrueOrderBySortOrderAsc(tagCategory);
return tags.stream()
.map(tag -> TasteTagResponse.builder()
.id(tag.getId())
.tagName(tag.getTagName())
.tagType(tagType)
.description(tag.getTagCategory().getDescription())
.build())
.collect(Collectors.toList());
}
/**
* TagCategory를 TagType으로 변환 (기존 호환성을 위해)
*/
private TagType convertTagCategoryToTagType(TagCategory tagCategory) {
// TagType enum이 존재한다면 적절한 매핑 로직 구현
// 임시로 기본값 반환
return TagType.TASTE; // 실제 매핑 로직 필요
}
/**
* TagType을 TagCategory로 변환 (기존 호환성을 위해)
*/
private TagCategory convertTagTypeToTagCategory(TagType tagType) {
// TagType에 따른 TagCategory 매핑
switch (tagType) {
case TASTE:
return TagCategory.TASTE;
default:
return TagCategory.TASTE;
}
}
}

View File

@ -28,8 +28,6 @@ public class TagService implements TagUseCase {
private final TagRepositoryPort tagRepositoryPort;
@Override
public List<TopClickedTagResponse> getTopClickedTags() {
log.info("가장 많이 클릭된 상위 5개 태그 조회 시작");