Skip to content

Commit 27c1687

Browse files
committed
refactor: DTO 계층 리팩토링 및 분리 (DASOMBE-15)
1 parent 1c73794 commit 27c1687

File tree

4 files changed

+138
-17
lines changed

4 files changed

+138
-17
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package dmu.dasom.api.domain.activity.dto;
2+
3+
import dmu.dasom.api.domain.activity.entity.Activity;
4+
import io.swagger.v3.oas.annotations.media.Schema;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
import java.time.format.DateTimeFormatter;
8+
9+
@Getter
10+
@Builder
11+
@Schema(name = "ActivityItemDto", description = "개별 활동 목록")
12+
public class ActivityItemDto {
13+
14+
@Schema(description = "활동 고유 ID", example = "1")
15+
private final Long id;
16+
17+
@Schema(description = "활동 날짜", example = "05.10")
18+
private final String monthDay; // 날짜 필드 추가
19+
20+
@Schema(description = "활동 제목", example = "컴퓨터 공학부 경진대회")
21+
private final String title;
22+
23+
@Schema(description = "수상 내역", example = "최우수상")
24+
private final String award;
25+
26+
public static ActivityItemDto of(Activity activity) {
27+
String formattedMonthDay = activity.getActivityDate()
28+
.format(DateTimeFormatter.ofPattern("MM.dd"));
29+
30+
return ActivityItemDto.builder()
31+
.id(activity.getId())
32+
.monthDay(formattedMonthDay)
33+
.title(activity.getTitle())
34+
.award(activity.getAward())
35+
.build();
36+
}
37+
}
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
11
package dmu.dasom.api.domain.activity.dto;
22

3-
import dmu.dasom.api.domain.activity.entity.ActivityHistory;
3+
import dmu.dasom.api.domain.activity.entity.Activity;
4+
import dmu.dasom.api.domain.activity.entity.Section;
45
import io.swagger.v3.oas.annotations.media.Schema;
5-
import jakarta.validation.constraints.Min;
66
import jakarta.validation.constraints.NotBlank;
77
import jakarta.validation.constraints.NotNull;
88
import jakarta.validation.constraints.Size;
9+
import lombok.Builder;
910
import lombok.Getter;
1011

12+
import java.time.LocalDate;
13+
1114
@Getter
15+
@Builder
1216
@Schema(name = "ActivityHistoryRequestDto", description = "활동 연혁 생성/수정 요청 DTO")
13-
public class ActivityHistoryRequestDto {
17+
public class ActivityRequestDto {
1418

15-
@NotNull(message = "연도는 필수입니다.")
16-
@Min(value = 1992, message = "연도는 1992년 이상이어야 합니다.")
17-
@Schema(description = "활동 연도", example = "2024", minimum = "1992", maximum = "2050")
18-
private int year;
19+
@NotNull(message = "활동 날짜는 필수입니다.")
20+
@Schema(description = "활동 날짜", example = "2024-08-21")
21+
private LocalDate activityDate;
1922

20-
@NotBlank(message = "섹션 제목은 필수입니다.")
21-
@Size(max = 50, message = "섹션은 50자 이내로 입력해주세요.")
2223
@Schema(description = "활동 섹션", example = "교내 경진대회", maxLength = 50)
2324
private String section;
2425

@@ -31,12 +32,4 @@ public class ActivityHistoryRequestDto {
3132
@Schema(description = "수상 내역 (선택 사항)", example = "최우수상", maxLength = 50)
3233
private String award;
3334

34-
public ActivityHistory toEntity() {
35-
return ActivityHistory.builder()
36-
.year(this.year)
37-
.section(this.section)
38-
.title(this.title)
39-
.award(this.award)
40-
.build();
41-
}
4235
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package dmu.dasom.api.domain.activity.dto;
2+
3+
import dmu.dasom.api.domain.activity.entity.Activity;
4+
import dmu.dasom.api.domain.activity.entity.Section;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
8+
import java.util.Comparator;
9+
import java.util.List;
10+
import java.util.Map;
11+
import java.util.stream.Collectors;
12+
13+
@Getter
14+
@Builder
15+
public class ActivityResponseDto {
16+
17+
private final int year;
18+
private final List<SectionItemDto> sections;
19+
20+
public static List<ActivityResponseDto> of(List<Activity> activities) {
21+
return activities.stream()
22+
.collect(Collectors.groupingBy(activity -> activity.getActivityDate().getYear()))
23+
.entrySet().stream()
24+
.sorted(Map.Entry.comparingByKey()) // 1. 연도 오름차순 정렬
25+
.map(entryByYear -> {
26+
List<SectionItemDto> sectionDtos = groupAndSortSections(entryByYear.getValue());
27+
return ActivityResponseDto.builder()
28+
.year(entryByYear.getKey())
29+
.sections(sectionDtos)
30+
.build();
31+
})
32+
.collect(Collectors.toList());
33+
}
34+
35+
private static List<SectionItemDto> groupAndSortSections(List<Activity> activitiesForYear) {
36+
return activitiesForYear.stream()
37+
.collect(Collectors.groupingBy(Activity::getSection))
38+
.entrySet().stream()
39+
.map(entryBySection -> {
40+
Section section = entryBySection.getKey();
41+
List<ActivityItemDto> activityDtos = mapAndSortActivities(entryBySection.getValue());
42+
return SectionItemDto.builder()
43+
.id(section.getId())
44+
.section(section.getName())
45+
.activities(activityDtos)
46+
.build();
47+
})
48+
// 2. 섹션 ID 오름차순 정렬
49+
.sorted(Comparator.comparing(SectionItemDto::getId))
50+
.collect(Collectors.toList());
51+
}
52+
53+
private static List<ActivityItemDto> mapAndSortActivities(List<Activity> activitiesForSection) {
54+
return activitiesForSection.stream()
55+
// 3. 활동 날짜 오름차순 정렬
56+
.sorted(Comparator.comparing(Activity::getActivityDate))
57+
.map(ActivityItemDto::of)
58+
.collect(Collectors.toList());
59+
}
60+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package dmu.dasom.api.domain.activity.dto;
2+
3+
import dmu.dasom.api.domain.activity.entity.Section;
4+
import io.swagger.v3.oas.annotations.media.Schema;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
8+
import java.util.List;
9+
10+
@Getter
11+
@Builder
12+
@Schema(name = "SectionItemDto", description = "섹션별 활동 목록")
13+
public class SectionItemDto {
14+
15+
@Schema(description = "활동 섹션 고유 ID", example = "1")
16+
private final Long id;
17+
18+
@Schema(description = "활동 섹션", example = "교내 경진대회")
19+
private final String section;
20+
21+
@Schema(description = "활동 목록")
22+
private final List<ActivityItemDto> activities;
23+
24+
public static SectionItemDto of(Section section, List<ActivityItemDto> activities) {
25+
return SectionItemDto.builder()
26+
.id(section.getId())
27+
.section(section.getName())
28+
.activities(activities)
29+
.build();
30+
}
31+
}

0 commit comments

Comments
 (0)