Skip to content

Commit 3925dae

Browse files
committed
refactor: 검색 필터 문자열 파싱 책임 분리
1 parent 1652f3e commit 3925dae

21 files changed

Lines changed: 321 additions & 136 deletions
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.zimdugo.locker.application.filter;
2+
3+
import com.zimdugo.locker.domain.locker.IndoorOutdoorType;
4+
5+
public enum IndoorOutdoorFilterType {
6+
INDOOR,
7+
OUTDOOR;
8+
9+
public IndoorOutdoorType toDomain() {
10+
return IndoorOutdoorType.valueOf(name());
11+
}
12+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.zimdugo.locker.application.filter;
2+
3+
import com.zimdugo.locker.domain.locker.LockerType;
4+
5+
public enum LockerFacilityFilterType {
6+
MUSEUM,
7+
SUBWAY_STATION,
8+
DEPARTMENT_STORE,
9+
CONVENIENCE_STORE,
10+
PUBLIC_OFFICE,
11+
PRIVATE_LOCKER,
12+
TRAIN_STATION,
13+
ETC;
14+
15+
public LockerType toDomain() {
16+
return LockerType.valueOf(name());
17+
}
18+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.zimdugo.locker.application.filter;
2+
3+
import com.zimdugo.locker.domain.locker.LockerSizeType;
4+
5+
public enum LockerSizeFilterType {
6+
SMALL,
7+
MEDIUM,
8+
LARGE;
9+
10+
public LockerSizeType toDomain() {
11+
return LockerSizeType.valueOf(name());
12+
}
13+
}
Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package com.zimdugo.locker.application.place;
22

3+
import com.zimdugo.locker.application.filter.IndoorOutdoorFilterType;
4+
import com.zimdugo.locker.application.filter.LockerFacilityFilterType;
5+
import com.zimdugo.locker.application.filter.LockerSizeFilterType;
36
import java.util.Set;
47

58
public record PlaceLockerQueryCommand(
69
Long placeId,
710
double latitude,
811
double longitude,
9-
Set<String> sizeTypes,
10-
Set<String> indoorOutdoorTypes,
11-
Set<String> lockerTypes
12+
Set<LockerSizeFilterType> sizeTypes,
13+
Set<IndoorOutdoorFilterType> indoorOutdoorTypes,
14+
Set<LockerFacilityFilterType> lockerTypes
1215
) {
1316
}

src/main/java/com/zimdugo/locker/application/place/PlaceLockerQueryService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.zimdugo.locker.application.place;
22

3+
import com.zimdugo.locker.application.filter.LockerSearchFilterFactory;
34
import com.zimdugo.common.i18n.CurrentRequestLanguage;
45
import com.zimdugo.core.exception.BusinessException;
56
import com.zimdugo.core.exception.ErrorCode;
@@ -37,7 +38,7 @@ public PlaceLockerResult getPlaceLockers(Long userId, PlaceLockerQueryCommand co
3738

3839
LockerPlace place = lockerPlaceReader.readById(command.placeId(), languageCode)
3940
.orElseThrow(() -> new BusinessException(ErrorCode.PLACE_NOT_FOUND));
40-
LockerSearchFilter filter = LockerSearchFilter.from(
41+
LockerSearchFilter filter = LockerSearchFilterFactory.create(
4142
command.sizeTypes(),
4243
command.indoorOutdoorTypes(),
4344
command.lockerTypes()
Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
package com.zimdugo.locker.application.search;
22

3+
import com.zimdugo.locker.application.filter.IndoorOutdoorFilterType;
4+
import com.zimdugo.locker.application.filter.LockerFacilityFilterType;
5+
import com.zimdugo.locker.application.filter.LockerSizeFilterType;
36
import java.util.Set;
47

58
public record LockerSearchCommand(
69
double latitude,
710
double longitude,
811
String keyword,
9-
Set<String> sizeTypes,
10-
Set<String> indoorOutdoorTypes,
11-
Set<String> lockerTypes,
12+
Set<LockerSizeFilterType> sizeTypes,
13+
Set<IndoorOutdoorFilterType> indoorOutdoorTypes,
14+
Set<LockerFacilityFilterType> lockerTypes,
1215
Double zoom
1316
) {
1417
}

src/main/java/com/zimdugo/locker/application/search/LockerSearchResultQueryService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.zimdugo.locker.application.search;
22

3+
import com.zimdugo.locker.application.filter.LockerSearchFilterFactory;
34
import com.zimdugo.common.i18n.CurrentRequestLanguage;
45
import com.zimdugo.locker.application.pin.LockerSearchPinAssembler;
56
import com.zimdugo.locker.application.pin.LockerPinClusterer;
@@ -102,7 +103,7 @@ public LockerSearchResult getSearchResults(
102103
}
103104

104105
private LockerSearchFilter toSearchFilter(LockerSearchCommand command) {
105-
return LockerSearchFilter.from(
106+
return LockerSearchFilterFactory.create(
106107
command.sizeTypes(),
107108
command.indoorOutdoorTypes(),
108109
command.lockerTypes()
Lines changed: 0 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,11 @@
11
package com.zimdugo.locker.domain.search;
22

3-
import com.zimdugo.core.exception.BusinessException;
4-
import com.zimdugo.core.exception.ErrorCode;
53
import com.zimdugo.locker.domain.locker.IndoorOutdoorType;
64
import com.zimdugo.locker.domain.locker.LockerSizeType;
75
import com.zimdugo.locker.domain.locker.LockerType;
8-
import java.util.Arrays;
96
import java.util.Collections;
107
import java.util.EnumSet;
11-
import java.util.Locale;
12-
import java.util.Objects;
138
import java.util.Set;
14-
import java.util.function.Function;
15-
import java.util.stream.Collectors;
16-
import lombok.extern.slf4j.Slf4j;
17-
18-
@Slf4j
199
public record LockerSearchFilter(
2010
Set<LockerSizeType> sizeTypes,
2111
Set<IndoorOutdoorType> indoorOutdoorTypes,
@@ -38,30 +28,6 @@ public static LockerSearchFilter empty() {
3828
return new LockerSearchFilter(Set.of(), Set.of(), Set.of());
3929
}
4030

41-
public static LockerSearchFilter from(
42-
Set<String> sizeTypes,
43-
Set<String> indoorOutdoorTypes,
44-
Set<String> lockerTypes
45-
) {
46-
log.debug(
47-
"검색 필터 파싱 시작. sizeTypes={}, indoorOutdoorTypes={}, lockerTypes={}",
48-
sizeTypes,
49-
indoorOutdoorTypes,
50-
lockerTypes
51-
);
52-
53-
Set<LockerSizeType> parsedSizeTypes = parseEnumSet(sizeTypes, LockerSizeType::from);
54-
Set<IndoorOutdoorType> parsedIndoorOutdoorTypes =
55-
parseEnumSet(indoorOutdoorTypes, val -> parse(val, IndoorOutdoorType.class));
56-
Set<LockerType> parsedLockerTypes = parseEnumSet(lockerTypes, val -> parse(val, LockerType.class));
57-
58-
return new LockerSearchFilter(
59-
parsedSizeTypes,
60-
parsedIndoorOutdoorTypes,
61-
parsedLockerTypes
62-
);
63-
}
64-
6531
public boolean isEmpty() {
6632
return sizeTypes.isEmpty() && indoorOutdoorTypes.isEmpty() && lockerTypes.isEmpty();
6733
}
@@ -75,33 +41,4 @@ public boolean matches(
7541
&& (indoorOutdoorTypes.isEmpty() || indoorOutdoorTypes.contains(lockerIndoorOutdoorType))
7642
&& (lockerTypes.isEmpty() || lockerTypes.contains(actualLockerType));
7743
}
78-
79-
private static <T extends Enum<T>> Set<T> parseEnumSet(
80-
Set<String> values,
81-
Function<String, T> mapper
82-
) {
83-
if (values == null) {
84-
return Set.of();
85-
}
86-
return values.stream()
87-
.filter(Objects::nonNull)
88-
.map(value -> value.replaceAll("[\\[\\]\"]", ""))
89-
.flatMap(value -> Arrays.stream(value.split(",")))
90-
.map(String::trim)
91-
.map(mapper)
92-
.filter(Objects::nonNull)
93-
.collect(Collectors.toUnmodifiableSet());
94-
}
95-
96-
private static <T extends Enum<T>> T parse(String value, Class<T> enumType) {
97-
if (value == null || value.isBlank()) {
98-
return null;
99-
}
100-
101-
try {
102-
return Enum.valueOf(enumType, value.trim().toUpperCase(Locale.ROOT));
103-
} catch (IllegalArgumentException e) {
104-
throw new BusinessException(ErrorCode.INVALID_PARAMETER_FORMAT);
105-
}
106-
}
10744
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.zimdugo.locker.entrypoint.config;
2+
3+
import com.zimdugo.locker.entrypoint.converter.IndoorOutdoorTypeRequestConverter;
4+
import com.zimdugo.locker.entrypoint.converter.LockerSizeTypeRequestConverter;
5+
import com.zimdugo.locker.entrypoint.converter.LockerTypeRequestConverter;
6+
import org.springframework.context.annotation.Configuration;
7+
import org.springframework.format.FormatterRegistry;
8+
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
9+
10+
@Configuration
11+
public class LockerRequestWebMvcConfig implements WebMvcConfigurer {
12+
13+
@Override
14+
public void addFormatters(FormatterRegistry registry) {
15+
registry.addConverter(new LockerSizeTypeRequestConverter());
16+
registry.addConverter(new IndoorOutdoorTypeRequestConverter());
17+
registry.addConverter(new LockerTypeRequestConverter());
18+
}
19+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.zimdugo.locker.entrypoint.converter;
2+
3+
import com.zimdugo.core.exception.BusinessException;
4+
import com.zimdugo.core.exception.ErrorCode;
5+
import com.zimdugo.locker.application.filter.IndoorOutdoorFilterType;
6+
import java.util.Locale;
7+
import org.springframework.core.convert.converter.Converter;
8+
9+
public class IndoorOutdoorTypeRequestConverter implements Converter<String, IndoorOutdoorFilterType> {
10+
11+
@Override
12+
public IndoorOutdoorFilterType convert(String source) {
13+
String normalized = LockerFilterRequestValueNormalizer.normalize(source);
14+
if (normalized == null || normalized.isBlank()) {
15+
return null;
16+
}
17+
18+
try {
19+
return IndoorOutdoorFilterType.valueOf(normalized.toUpperCase(Locale.ROOT));
20+
} catch (IllegalArgumentException e) {
21+
throw new BusinessException(ErrorCode.INVALID_PARAMETER_FORMAT);
22+
}
23+
}
24+
}

0 commit comments

Comments
 (0)