Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: 패키지 구조 정리 및 추천 알고리즘 추상화 #454

Open
wants to merge 8 commits into
base: backend
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.digginroom.digginroom.admin.controller.dto.UploadRequest;
import com.digginroom.digginroom.admin.service.UploadService;
import com.digginroom.digginroom.domain.Genre;
import com.digginroom.digginroom.domain.room.Genre;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.digginroom.digginroom.admin.controller.dto;

import com.digginroom.digginroom.domain.Genre;
import com.digginroom.digginroom.domain.room.Genre;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.digginroom.digginroom.controller;

import com.digginroom.digginroom.service.RoomService;
import com.digginroom.digginroom.service.dto.RoomRequest;
import com.digginroom.digginroom.service.dto.RoomResponse;
import com.digginroom.digginroom.service.dto.RoomsResponse;
import com.digginroom.digginroom.service.RoomService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.digginroom.digginroom.domain;

import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.MappedSuperclass;
import java.time.LocalDateTime;
import java.util.UUID;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class UUIDBaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.UUID)
private UUID id;
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime updatedAt;
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
package com.digginroom.digginroom.domain.member;

import com.digginroom.digginroom.domain.BaseEntity;
import com.digginroom.digginroom.domain.Genre;
import com.digginroom.digginroom.domain.member.vo.Nickname;
import com.digginroom.digginroom.domain.member.vo.Password;
import com.digginroom.digginroom.domain.member.vo.Provider;
import com.digginroom.digginroom.domain.room.Room;
import com.digginroom.digginroom.exception.MemberException.DuplicatedFavoriteException;
import com.digginroom.digginroom.exception.MemberException.EmptyFavoriteException;
import com.digginroom.digginroom.exception.MemberException.FavoriteExistsException;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import java.util.HashSet;
import java.util.List;
import java.util.UUID;
import lombok.AccessLevel;
Expand All @@ -29,16 +27,10 @@ public class Member extends BaseEntity {
private Password password;
@Enumerated(value = EnumType.STRING)
private Provider provider;
@Getter(AccessLevel.NONE)
private boolean hasFavorite = false;
@Embedded
private Nickname nickname;
@Embedded
private final ScrapRooms scrapRooms = new ScrapRooms();
@Embedded
private final DislikeRooms dislikeRooms = new DislikeRooms();
@Embedded
private final MemberGenres memberGenres = new MemberGenres(this);

private Member(final String username, final Password password, final Provider provider, final Nickname nickname) {
this.username = username;
Expand Down Expand Up @@ -66,70 +58,20 @@ public static Member guest() {

public void scrap(final Room room) {
scrapRooms.scrap(room);
adjustMemberGenreWeight(room, WeightFactor.SCRAP);
}

public void unscrap(final Room room) {
scrapRooms.unscrap(room);
adjustMemberGenreWeight(room, WeightFactor.UNSCRAP);
}

public void dislike(final Room room) {
dislikeRooms.dislike(room);
adjustMemberGenreWeight(room, WeightFactor.DISLIKE);
}

public void undislike(final Room room) {
dislikeRooms.undislike(room);
adjustMemberGenreWeight(room, WeightFactor.UNDISLIKE);
}

public void markFavorite(final List<Genre> genres) {
if (hasFavorite) {
throw new FavoriteExistsException();
}
if (hasDuplicate(genres)) {
throw new DuplicatedFavoriteException();
}
if (genres.isEmpty()) {
throw new EmptyFavoriteException();
}

for (Genre genre : genres) {
memberGenres.adjustWeightBy(genre, WeightFactor.FAVORITE);
}
hasFavorite = true;
}

private boolean hasDuplicate(final List<Genre> genres) {
return new HashSet<>(genres).size() != genres.size();
}

private void adjustMemberGenreWeight(final Room room, final WeightFactor weightFactor) {
Genre superGenre = room.getTrack().getSuperGenre();
memberGenres.adjustWeightBy(superGenre, weightFactor);
}

public boolean hasFavorite() {
return hasFavorite;
}

public boolean hasScrapped(final Room pickedRoom) {
return scrapRooms.hasScrapped(pickedRoom);
}

public List<MemberGenre> getMemberGenres() {
return memberGenres.getAll();
}

public List<Room> getScrapRooms() {
return scrapRooms.getScrapRooms();
}

public List<Room> getDislikeRooms() {
return dislikeRooms.getDislikeRooms();
}

public String getNickname() {
return nickname.getNickname();
}
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.digginroom.digginroom.domain.member;
package com.digginroom.digginroom.domain.member.vo;

import jakarta.persistence.Embeddable;
import java.util.UUID;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.digginroom.digginroom.domain.member;
package com.digginroom.digginroom.domain.member.vo;

import com.digginroom.digginroom.util.PasswordEncoder;
import jakarta.persistence.Embeddable;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.digginroom.digginroom.domain.member;
package com.digginroom.digginroom.domain.member.vo;

import java.util.Arrays;
import java.util.Optional;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.digginroom.digginroom.domain.recommend;

import com.digginroom.digginroom.domain.room.Genre;

public interface GenreRecommender {

Genre recommend(final Long memberId);
}
Comment on lines +5 to +8
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.digginroom.digginroom.domain.recommend;

import com.digginroom.digginroom.domain.room.Genre;
import com.digginroom.digginroom.domain.room.Room;
import com.digginroom.digginroom.exception.RecommendException.NoRecommendableRoomException;
import com.digginroom.digginroom.repository.RoomRepository;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class RandomInGenreRoomRecommender implements RoomRecommender {

private final RoomRepository roomRepository;
private final GenreRecommender genreRecommender;

@Override
public Long recommend(final Long memberId) {
Genre recommenedGenre = genreRecommender.recommend(memberId);
return recommendRoom(recommenedGenre).getId();
}

private Room recommendRoom(final Genre recommendedGenre) {
List<Room> rooms = roomRepository.findByTrackSuperGenre(recommendedGenre);
if (rooms.isEmpty()) {
throw new NoRecommendableRoomException(recommendedGenre.getName());
}
int pickedIndex = ThreadLocalRandom.current().nextInt(rooms.size());
return rooms.get(pickedIndex);
}
}
Loading
Loading