Skip to content

Commit 6736f3a

Browse files
committed
[hotfix] refactor: 이미 DB에 존재하는 장소의 경우 등록시 예외를 던지도록 수정
1 parent 5dbbc3e commit 6736f3a

File tree

8 files changed

+65
-16
lines changed

8 files changed

+65
-16
lines changed

src/main/java/org/recordy/server/common/message/ErrorMessage.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ public enum ErrorMessage {
7373
*/
7474
PLACE_NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않는 장소입니다."),
7575
PLATFORM_PLACE_NO_SEARCH_RESULT(HttpStatus.NOT_FOUND, "지도 검색 결과가 없습니다."),
76+
PLACE_ALREADY_EXISTS(HttpStatus.BAD_REQUEST, "이미 등록된 장소입니다."),
7677

7778
/**
7879
* BOOKMARK

src/main/java/org/recordy/server/place/controller/PlaceApi.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,26 @@ public interface PlaceApi {
104104
)
105105
)
106106
),
107+
@ApiResponse(
108+
responseCode = "400",
109+
description = "이미 존재하는 장소입니다.",
110+
content = @Content(
111+
mediaType = MediaType.APPLICATION_JSON_VALUE,
112+
examples = {
113+
@ExampleObject(
114+
value = """
115+
{
116+
"errorCode": "400 BAD REQUEST",
117+
"errorMessage": "이미 존재하는 장소입니다."
118+
}
119+
"""
120+
)
121+
},
122+
schema = @Schema(
123+
implementation = ErrorResponse.class
124+
)
125+
)
126+
),
107127
@ApiResponse(
108128
responseCode = "500",
109129
description = "서버 내부 오류입니다.",

src/main/java/org/recordy/server/place/repository/PlaceRepository.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public interface PlaceRepository {
1212
Place save(Place place);
1313

1414
// query
15+
boolean existsByPlatformId(String platformId);
1516
Place findById(long id);
1617
Place findByName(String name);
1718
PlaceGetResponse findDetailById(Long id);

src/main/java/org/recordy/server/place/repository/impl/PlaceQueryDslRepository.java

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import java.util.List;
2222
import java.util.Map;
23+
import java.util.Objects;
2324
import java.util.Optional;
2425
import java.util.stream.Collectors;
2526

@@ -50,6 +51,16 @@ public class PlaceQueryDslRepository {
5051
locationGetResponse
5152
);
5253

54+
public boolean existsByPlatformId(String platformId) {
55+
return Objects.nonNull(
56+
jpaQueryFactory
57+
.selectOne()
58+
.from(placeEntity)
59+
.where(placeEntity.platformId.eq(platformId))
60+
.fetchFirst()
61+
);
62+
}
63+
5364
public PlaceEntity findById(long id) {
5465
return jpaQueryFactory
5566
.select(placeEntity)
@@ -76,28 +87,28 @@ private Long findIdWith(BooleanExpression... expressions) {
7687

7788
public PlaceGetResponse findById(Long id) {
7889
PlaceGetResponse place = Optional.ofNullable(jpaQueryFactory
79-
.select(placeGetResponse)
80-
.from(placeEntity)
81-
.join(placeEntity.location, locationEntity)
82-
.where(placeEntity.id.eq(id))
83-
.fetchOne())
90+
.select(placeGetResponse)
91+
.from(placeEntity)
92+
.join(placeEntity.location, locationEntity)
93+
.where(placeEntity.id.eq(id))
94+
.fetchOne())
8495
.orElseThrow(() -> new PlaceException(ErrorMessage.PLACE_NOT_FOUND));
8596

8697
Long exhibitionSize = Optional.ofNullable(jpaQueryFactory
87-
.select(exhibitionEntity.count())
88-
.from(placeEntity)
89-
.leftJoin(exhibitionEntity).on(exhibitionEntity.place.eq(placeEntity))
90-
.where(placeEntity.id.eq(id))
91-
.fetchOne())
98+
.select(exhibitionEntity.count())
99+
.from(placeEntity)
100+
.leftJoin(exhibitionEntity).on(exhibitionEntity.place.eq(placeEntity))
101+
.where(placeEntity.id.eq(id))
102+
.fetchOne())
92103
.orElse(0L);
93104
place.setExhibitionSize(exhibitionSize);
94105

95106
Long recordSize = Optional.ofNullable(jpaQueryFactory
96-
.select(recordEntity.count())
97-
.from(placeEntity)
98-
.leftJoin(recordEntity).on(recordEntity.place.id.eq(id))
99-
.where(placeEntity.id.eq(id))
100-
.fetchOne())
107+
.select(recordEntity.count())
108+
.from(placeEntity)
109+
.leftJoin(recordEntity).on(recordEntity.place.id.eq(id))
110+
.where(placeEntity.id.eq(id))
111+
.fetchOne())
101112
.orElse(0L);
102113
place.setRecordSize(recordSize);
103114

src/main/java/org/recordy/server/place/repository/impl/PlaceRepositoryImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ public Place save(Place place) {
3131
return Place.from(entity);
3232
}
3333

34+
@Override
35+
public boolean existsByPlatformId(String platformId) {
36+
return placeQueryDslRepository.existsByPlatformId(platformId);
37+
}
38+
3439
@Override
3540
public Place findById(long id) {
3641
PlaceEntity entity = placeQueryDslRepository.findById(id);

src/main/java/org/recordy/server/place/service/impl/PlaceServiceImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package org.recordy.server.place.service.impl;
22

33
import lombok.RequiredArgsConstructor;
4+
import org.recordy.server.common.message.ErrorMessage;
45
import org.recordy.server.location.domain.Location;
56
import org.recordy.server.place.controller.dto.request.PlaceCreateRequest;
67
import org.recordy.server.place.controller.dto.response.PlaceGetResponse;
78
import org.recordy.server.place.controller.dto.response.PlaceReviewGetResponse;
89
import org.recordy.server.place.domain.Place;
910
import org.recordy.server.place.domain.usecase.PlaceCreate;
11+
import org.recordy.server.place.exception.PlaceException;
1012
import org.recordy.server.place.repository.PlaceRepository;
1113
import org.recordy.server.place.repository.PlaceReviewRepository;
1214
import org.recordy.server.place.service.PlaceService;
@@ -32,6 +34,10 @@ public class PlaceServiceImpl implements PlaceService {
3234
@Transactional
3335
@Override
3436
public Place create(PlaceCreateRequest request) {
37+
if (placeRepository.existsByPlatformId(request.id())) {
38+
throw new PlaceException(ErrorMessage.PLACE_ALREADY_EXISTS);
39+
}
40+
3541
Location location = Location.of(geometryConverter.of(request.latitude(), request.longitude()));
3642
Place place = placeRepository.save(Place.create(PlaceCreate.from(request, location)));
3743

src/test/java/org/recordy/server/mock/place/FakePlaceRepository.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ public Place save(Place place) {
3131
return realPlace;
3232
}
3333

34+
@Override
35+
public boolean existsByPlatformId(String platformId) {
36+
return false;
37+
}
38+
3439
@Override
3540
public Place findById(long id) {
3641
return places.get(id);

src/test/java/org/recordy/server/place/service/PlatformPlaceServiceTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class PlatformPlaceServiceTest {
2020
@ParameterizedTest
2121
void 검색_결과중_가장_정확도가_높은_장소에_대한_정보를_수집할_수_있다(String query) {
2222
// when
23-
List<PlatformPlaceSearchResponse> result = platformPlaceService.search(query, 0);
23+
List<PlatformPlaceSearchResponse> result = platformPlaceService.search(query, 1);
2424

2525
// then
2626
assertThat(result).isNotEmpty();

0 commit comments

Comments
 (0)