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] : Result와 Stadium의 DDD구조 변경 및 Result 어그리게이트에 관한 간접참조와, 객체탐색 리팩토링을 진행한다. #84

Merged
merged 39 commits into from
Nov 25, 2024
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
16bae29
#80 [feat] 구장별 구역 순서를 맞게 변경한다.
juuuunny Nov 23, 2024
70236d4
#80 [feat] 구역 추천리스트 무조건 3개 채워서 반환하도록 로직을 변경한다.
juuuunny Nov 23, 2024
03a3b3a
#80 [feat] 수원KT위즈파크의 응원지정석의 더미데이터를 수정한다.
juuuunny Nov 23, 2024
0d69526
#80 [rename] zone의 테이블명을 수정한다.
juuuunny Nov 23, 2024
c949bc6
Merge pull request #81 from KUSITMS-30th-TEAM-A/feature/#80/modify-re…
juuuunny Nov 23, 2024
b182571
#80 [refactor] Result 엔티티의 user와 stadium을 간접참조로 변경하고, result내에서 profi…
juuuunny Nov 23, 2024
335b232
#78 [refactor] profile과 zone의 result연결 메서드를 삽입한다.
juuuunny Nov 23, 2024
62223f0
#78 [feat] 스타디움명을 통하여 해당 스타디움의 id를 반환해주는 메소드를 추가한다.
juuuunny Nov 23, 2024
f3e29d3
#78 [feat] 유저id를 통하여 해당 유저 존재여부 확인 메서드를 추가한다.
juuuunny Nov 23, 2024
e3b76e8
#78 [refactor] resultService에서 타 어그리게이트의 레포지토리가 아닌 서비스를 호출하도록 로직을 변경한다.
juuuunny Nov 23, 2024
350c076
#78 [refactor] Result 서비스 내에서 객체탐색을 통하여 하위 엔티티를 찾을 수 있도록 변경한다.
juuuunny Nov 23, 2024
ff6fa39
#78 [refactor] result 어그리게이트의 dto를 응용계층으로 이동한다.:
juuuunny Nov 23, 2024
9c8d0eb
#78 [rename] resultService의 파일명을 resultApplicationService로 변경한다.
juuuunny Nov 23, 2024
689ddaa
#78 [refactor] result 어그리게이트의 presentation의 javadoc 주석을 변경하여 리팩토링을 진행한다.
juuuunny Nov 23, 2024
59fdbe5
#78 [rename] 추천받은 결과 저장 메소드명을 변경한다.
juuuunny Nov 23, 2024
206f230
#78 [refactor] Result 어그리게이트의 application과 domai 리팩토링을 진행한다.
juuuunny Nov 23, 2024
0af0a06
#78 [refactor] Result 어그리거트의 전체적이 구조 리팩토링을 진행한다. (presentation, appli…
juuuunny Nov 24, 2024
2f16fc1
#78 [refactor] Stadium 도메인의 리팩토링을 DDD에 맞게 리팩토링한다.
juuuunny Nov 24, 2024
59594d1
#78 [refactor] culture를 stadium 어그리거트에 통합하고 DDD구조로 변경한다.
juuuunny Nov 25, 2024
94ccfde
#78 [chore] stadium에 로그 메시지를 추가한다.
juuuunny Nov 25, 2024
15b1907
#78 [refactor] 스타디움, 결과 테스트 코드를 수정한다.
juuuunny Nov 25, 2024
2868419
#78 [rename] querydsl custom Repository의 클래스명을 변경한다.
juuuunny Nov 25, 2024
754e42d
#78 [rename] result 도메인의 키워드에 따른 결과 반환 클래스들의 클래스명을 변경한다.
juuuunny Nov 25, 2024
a50ab0e
#78 [refactor] 구역 추천 결과 저장 시 repository에서 id가 아닌 Result 자체를 반환하도록 변경한다.
juuuunny Nov 25, 2024
0af522a
#78 [refactor] RecommendedTopRankedZonesManager의 메서드 분리를 하여 가독성을 좋게한다.
juuuunny Nov 25, 2024
d973259
#78 [refactor] RecommendedUserProfileManager의 메서드 분리를 하여 가독성을 좋게한다.
juuuunny Nov 25, 2024
b027498
#78 [rename] ResultRepositoryImpl이 클래스명을 변경한다.
juuuunny Nov 25, 2024
30fee7a
#78 [refactor] DB에 접근하지 않는 필요없는 트랜잭션은 제거한다.
juuuunny Nov 25, 2024
48066d2
#78 [refactor] 도메인에서는 BaseTimeEntity를 상속받지 않도록 변경한다.
juuuunny Nov 25, 2024
4d925eb
#78 [rename] Stadium 레포지토리의 Impl 부분의 클래스명을 변경한다.
juuuunny Nov 25, 2024
8073a95
#78 [chore] stadium과 result 어그리거트의 공백 및 개행문자 처리를 한다.(파일 가장 끝에는 엔터 1개)
juuuunny Nov 25, 2024
cbb59d0
#78 [chore] result 도메인의 기본 url을 변경한다.
juuuunny Nov 25, 2024
6ccefaf
#78 [refactor] Stadium 어그리거트에서 Food와 Entertainment 파일을 분리한다.
juuuunny Nov 25, 2024
e84f34a
#78 [feat] stadium 어그리거트의 테스트 코드를 리팩토링 한 것에 맞게 수정한다.
juuuunny Nov 25, 2024
e7bd5b4
#78 [feat] 즐길거리와 먹거리 url 변경에 따른 jwt Filter와 Spring Security Url을 변경해준다.
juuuunny Nov 25, 2024
851bb8d
#78 [chore] 테스트에서 잠실종합운동장을 잠실종합운동장 (잠실)로 변경한다.
juuuunny Nov 25, 2024
6d30113
#78 [chore] userId에 따른 유저 존재 여부의 메서드명을 변경한다.
juuuunny Nov 25, 2024
ee20869
#78 [refactor] stadium 어그리거트의 status enum을 분리한다.
juuuunny Nov 25, 2024
6ad12de
#78 [feat] userApplicationService의 충돌난 부분을 변경한다.
juuuunny Nov 25, 2024
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
40 changes: 13 additions & 27 deletions src/main/java/kusitms/backend/result/application/ResultService.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,15 @@
import kusitms.backend.result.domain.enums.KtWizStadiumStatusType;
import kusitms.backend.result.domain.enums.ProfileStatusType;
import kusitms.backend.result.domain.enums.StadiumStatusType;
import kusitms.backend.result.domain.repository.ProfileRepository;
import kusitms.backend.result.domain.repository.ResultRepository;
import kusitms.backend.result.domain.repository.ZoneRepository;
import kusitms.backend.result.dto.request.SaveTopRankedZoneRequestDto;
import kusitms.backend.result.dto.response.GetProfileResponseDto;
import kusitms.backend.result.dto.response.GetZonesResponseDto;
import kusitms.backend.result.dto.response.SaveTopRankedZoneResponseDto;
import kusitms.backend.result.status.ResultErrorStatus;
import kusitms.backend.stadium.domain.entity.Stadium;
import kusitms.backend.stadium.domain.repository.StadiumRepository;
import kusitms.backend.stadium.application.StadiumService;
import kusitms.backend.stadium.status.StadiumErrorStatus;
import kusitms.backend.user.domain.entity.User;
import kusitms.backend.user.domain.repository.UserRepository;
import kusitms.backend.user.status.UserErrorStatus;
import kusitms.backend.user.application.UserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
Expand All @@ -37,11 +32,9 @@
@RequiredArgsConstructor
public class ResultService {

private final UserRepository userRepository;
private final StadiumRepository stadiumRepository;
private final UserService userService;
private final StadiumService stadiumService;
private final ResultRepository resultRepository;
private final ZoneRepository zoneRepository;
private final ProfileRepository profileRepository;
private final JWTUtil jwtUtil;

@Transactional
Expand All @@ -58,49 +51,44 @@ public <T extends Enum<T> & StadiumStatusType> SaveTopRankedZoneResponseDto save
List<T> recommendedZones = RecommendTopRankedZones.getTopRankedZones(
zones, List.of(request.clientKeywords()));

Stadium stadium = stadiumRepository.findByName(request.stadium())
.orElseThrow(() -> new CustomException(StadiumErrorStatus._NOT_FOUND_STADIUM));
Long stadiumId = stadiumService.getIdByStadiumName(request.stadium());
Result result;
if (accessToken == null) {
result = Result.builder()
.stadium(stadium)
.stadiumId(stadiumId)
.preference(request.preference())
.build();
resultRepository.save(result);
}
else{
Long userId = jwtUtil.getUserIdFromToken(accessToken);
User user = userRepository.findById(userId)
.orElseThrow(() -> new CustomException(UserErrorStatus._NOT_FOUND_USER));
log.info("유저 정보 조회 성공");
userService.isExistUserById(userId);

result = Result.builder()
.stadium(stadium)
.user(user)
.userId(userId)
.stadiumId(stadiumId)
.preference(request.preference())
.build();
resultRepository.save(result);
}

Profile profile = Profile.builder()
.result(result)
.imgUrl(recommendedProfile.getImgUrl())
.nickname(recommendedProfile.getNickName())
.type(recommendedProfile.getType())
.hashTags(recommendedProfile.getHashTags())
.build();
profileRepository.save(profile);
result.addProfile(profile);

recommendedZones.forEach(zoneEnum -> {
Zone zone = Zone.builder()
.result(result)
.name(zoneEnum.getZoneName())
.color(zoneEnum.getZoneColor())
.explanations(zoneEnum.getExplanations())
.tip(zoneEnum.getTip())
.referencesGroup(zoneEnum.getReferencesGroup())
.build();
zoneRepository.save(zone);
result.addZone(zone);
});

return SaveTopRankedZoneResponseDto.of(result.getId());
Expand All @@ -110,16 +98,14 @@ public <T extends Enum<T> & StadiumStatusType> SaveTopRankedZoneResponseDto save
public GetProfileResponseDto getRecommendedProfile(Long resultId) {
Result result = resultRepository.findById(resultId)
.orElseThrow(() -> new CustomException(ResultErrorStatus._NOT_FOUND_RESULT));
Profile profile = profileRepository.findByResult(result)
.orElseThrow(() -> new CustomException(ResultErrorStatus._NOT_FOUND_PROFILE));
return GetProfileResponseDto.from(profile);
return GetProfileResponseDto.from(result.getProfile());
}

@Transactional(readOnly = true)
public GetZonesResponseDto getRecommendedZones(Long resultId, Long count) {
Result result = resultRepository.findById(resultId)
.orElseThrow(() -> new CustomException(ResultErrorStatus._NOT_FOUND_RESULT));
List<GetZonesResponseDto.ZoneResponseDto> zones = zoneRepository.findAllByResult(result)
List<GetZonesResponseDto.ZoneResponseDto> zones = result.getZones()
.stream()
.limit(count)
.map(GetZonesResponseDto.ZoneResponseDto::from)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import lombok.extern.slf4j.Slf4j;

import java.util.*;
import java.util.stream.Collectors;

@Slf4j
public class RecommendTopRankedZones {
Expand Down Expand Up @@ -50,15 +51,24 @@ public static <T extends Enum<T> & StadiumStatusType> List<T> getTopRankedZones(
log.info("zone: {}, totalMatchCount: {}, page1Count: {}, page2Count: {}, page3Count: {}", result.get("zone"), result.get("totalMatchCount"), result.get("page1Count"), result.get("page2Count"), result.get("page3Count"));
return (T) result.get("zone");
})
.collect(Collectors.toCollection(ArrayList::new)); // 수정 가능한 리스트 생성

List<T> priorityDummyZones = Arrays.stream(zones)
.filter(zone -> {
int ordinal = zone.ordinal();
return ordinal == 0 || ordinal == 1 || ordinal == 2;
})
.toList();

// 필터링된 결과가 없을 경우 첫 번째 구역을 반환
if (filteredZones.isEmpty()) {
return Arrays.stream(zones)
.findFirst()
.map(List::of)
.orElse(Collections.emptyList());
for (T priorityDummyZone : priorityDummyZones) {
if (filteredZones.size() >= 3) {
break;
}
if (!filteredZones.contains(priorityDummyZone)) {
filteredZones.add(priorityDummyZone);
}
}

return filteredZones;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,14 @@ public class Profile extends BaseTimeEntity {
private List<String> hashTags;

@Builder
public Profile(Result result, String imgUrl, String nickname, String type, String explanation, List<String> hashTags) {
this.result = result;
public Profile(String imgUrl, String nickname, String type, String explanation, List<String> hashTags) {
this.imgUrl = imgUrl;
this.nickname = nickname;
this.type = type;
this.hashTags = hashTags;
}

public void assignToResult(Result result) {
this.result = result;
}
}
38 changes: 24 additions & 14 deletions src/main/java/kusitms/backend/result/domain/entity/Result.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,12 @@

import jakarta.persistence.*;
import kusitms.backend.global.domain.BaseTimeEntity;
import kusitms.backend.stadium.domain.entity.Stadium;
import kusitms.backend.user.domain.entity.User;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;

@Entity
Expand All @@ -21,24 +20,35 @@ public class Result extends BaseTimeEntity {
@Column(name = "result_id", nullable = false)
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "stadium_id", nullable = false)
private Stadium stadium;
@Column(name = "user_id", nullable = false)
private Long userId; // User를 ID로 간접 참조

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
@Column(name = "stadium_id", nullable = false)
private Long stadiumId; // Stadium을 ID로 간접 참조

@Column(nullable = false)
private String preference;

@OneToMany(mappedBy = "result", cascade = CascadeType.ALL)
private List<Zone> zones;
@OneToOne(mappedBy = "result", cascade = CascadeType.ALL, orphanRemoval = true)
private Profile profile;

@OneToMany(mappedBy = "result", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Zone> zones = new ArrayList<>();

@Builder
public Result(Stadium stadium, User user, String preference) {
this.stadium = stadium;
this.user = user;
public Result(Long userId, Long stadiumId, String preference) {
this.userId = userId;
this.stadiumId = stadiumId;
this.preference = preference;
}
}

public void addProfile(Profile profile) {
this.profile = profile;
profile.assignToResult(this);
}

public void addZone(Zone zone){
this.zones.add(zone);
zone.assignToResult(this);
}
}
7 changes: 5 additions & 2 deletions src/main/java/kusitms/backend/result/domain/entity/Zone.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,15 @@ public class Zone extends BaseTimeEntity {
private List<ReferencesGroup> referencesGroup;

@Builder
public Zone(Result result, String name, String color, List<String> explanations, String tip, List<ReferencesGroup> referencesGroup) {
this.result = result;
public Zone(String name, String color, List<String> explanations, String tip, List<ReferencesGroup> referencesGroup) {
this.name = name;
this.color = color;
this.explanations = explanations;
this.tip = tip;
this.referencesGroup = referencesGroup;
}

public void assignToResult(Result result) {
this.result = result;
}
}
Loading
Loading