Skip to content

Commit c304461

Browse files
authored
Merge pull request #156 from YAPP-Github/feat/PRODUCT-236
[Feat] Store 에 district 컬럼 추가
2 parents 305c348 + ae91bcf commit c304461

File tree

16 files changed

+207
-55
lines changed

16 files changed

+207
-55
lines changed

src/main/java/eatda/client/map/MapClientStoreSearchResult.java

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
44
import com.fasterxml.jackson.annotation.JsonProperty;
5-
import eatda.domain.store.Store;
5+
import eatda.domain.store.District;
66
import eatda.domain.store.StoreCategory;
77
import eatda.domain.store.StoreSearchResult;
88
import java.util.Map;
@@ -29,6 +29,7 @@ public record MapClientStoreSearchResult(
2929
"음식점 > 카페", StoreCategory.CAFE,
3030
"음식점 > 간식 > 제과,베이커리", StoreCategory.CAFE
3131
);
32+
private static final District DEFAULT_DISTRICT = District.ETC;
3233

3334
public boolean isFoodStore() {
3435
return "FD6".equals(categoryGroupCode);
@@ -54,18 +55,15 @@ public StoreCategory getStoreCategory() {
5455
.orElse(StoreCategory.OTHER);
5556
}
5657

57-
public Store toStore() {
58-
return Store.builder()
59-
.kakaoId(kakaoId)
60-
.category(getStoreCategory())
61-
.phoneNumber(phoneNumber)
62-
.name(name)
63-
.placeUrl(placeUrl)
64-
.roadAddress(roadAddress)
65-
.lotNumberAddress(lotNumberAddress)
66-
.latitude(latitude)
67-
.longitude(longitude)
68-
.build();
58+
public District getDistrict() {
59+
if (lotNumberAddress == null || lotNumberAddress.isBlank()) {
60+
return DEFAULT_DISTRICT;
61+
}
62+
String[] addressParts = lotNumberAddress.split(" ");
63+
if (addressParts.length < 2) {
64+
return DEFAULT_DISTRICT;
65+
}
66+
return District.fromName(addressParts[1]);
6967
}
7068

7169
public StoreSearchResult toDomain() {
@@ -77,6 +75,7 @@ public StoreSearchResult toDomain() {
7775
placeUrl,
7876
lotNumberAddress,
7977
roadAddress,
78+
getDistrict(),
8079
latitude,
8180
longitude
8281
);
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package eatda.domain.store;
2+
3+
import java.util.Arrays;
4+
import lombok.Getter;
5+
6+
@Getter
7+
public enum District {
8+
9+
GANGNAM("강남구"),
10+
GANGDONG("강동구"),
11+
GANGBUK("강북구"),
12+
GANGSEO("강서구"),
13+
GWANAK("관악구"),
14+
GWANGJIN("광진구"),
15+
GURO("구로구"),
16+
GEUMCHEON("금천구"),
17+
NOWON("노원구"),
18+
DOBONG("도봉구"),
19+
DONGDAEMUN("동대문구"),
20+
DONGJAK("동작구"),
21+
MAPO("마포구"),
22+
SEODAEMUN("서대문구"),
23+
SEOCHO("서초구"),
24+
SEONGDONG("성동구"),
25+
SEONGBUK("성북구"),
26+
SONGPA("송파구"),
27+
YANGCHEON("양천구"),
28+
YEONGDEUNGPO("영등포구"),
29+
YONGSAN("용산구"),
30+
EUNPYEONG("은평구"),
31+
JONGNO("종로구"),
32+
JUNG("중구"),
33+
JUNGNANG("중랑구"),
34+
ETC("기타"),
35+
;
36+
37+
private final String name;
38+
39+
District(String name) {
40+
this.name = name;
41+
}
42+
43+
public static District fromName(String name) {
44+
if (name == null || name.isEmpty()) {
45+
return ETC;
46+
}
47+
return Arrays.stream(District.values())
48+
.filter(district -> district.name.equals(name.trim()))
49+
.findFirst()
50+
.orElse(ETC);
51+
}
52+
}

src/main/java/eatda/domain/store/Store.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ public class Store extends AuditingEntity {
4747
@Column(name = "lot_number_address", nullable = false)
4848
private String lotNumberAddress;
4949

50+
@Enumerated(EnumType.STRING)
51+
@Column(name = "district", nullable = false, length = 31)
52+
private District district;
53+
5054
@Embedded
5155
private Coordinates coordinates;
5256

@@ -58,6 +62,7 @@ private Store(String kakaoId,
5862
String placeUrl,
5963
String roadAddress,
6064
String lotNumberAddress,
65+
District district,
6166
Double latitude,
6267
Double longitude) {
6368
this.kakaoId = kakaoId;
@@ -66,16 +71,13 @@ private Store(String kakaoId,
6671
this.name = name;
6772
this.placeUrl = placeUrl;
6873
this.roadAddress = roadAddress;
74+
this.district = district;
6975
this.lotNumberAddress = lotNumberAddress;
7076
this.coordinates = new Coordinates(latitude, longitude);
7177
}
7278

7379
public String getAddressDistrict() {
74-
String[] addressParts = lotNumberAddress.split(" ");
75-
if (addressParts.length < 2) {
76-
return "";
77-
}
78-
return addressParts[1];
80+
return district.getName();
7981
}
8082

8183
public String getAddressNeighborhood() {

src/main/java/eatda/domain/store/StoreSearchResult.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public record StoreSearchResult(
88
String placeUrl,
99
String lotNumberAddress,
1010
String roadAddress,
11+
District district,
1112
double latitude,
1213
double longitude
1314
) {
@@ -21,6 +22,7 @@ public Store toStore() {
2122
.placeUrl(placeUrl)
2223
.roadAddress(roadAddress)
2324
.lotNumberAddress(lotNumberAddress)
25+
.district(district)
2426
.latitude(latitude)
2527
.longitude(longitude)
2628
.build();

src/main/resources/db/migration/V1__init.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ CREATE TABLE `store`
2020
`place_url` VARCHAR(255) NOT NULL,
2121
`road_address` VARCHAR(255) NOT NULL,
2222
`lot_number_address` VARCHAR(255) NOT NULL,
23+
`district` VARCHAR(31) NOT NULL,
2324
`latitude` DOUBLE NOT NULL,
2425
`longitude` DOUBLE NOT NULL,
2526
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

src/main/resources/db/seed/dev/V2__dev_init_data.sql

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,22 @@ VALUES (1, 123456789, '[email protected]', '이승로', '01012345678', true),
77
(6, 324569987, '[email protected]', '박희수', '01043609998', false),
88
(7, 323487985, '[email protected]', '하아얀', '01065083298', false);
99

10-
INSERT INTO store (id, kakao_id, category, phone_number, name, place_url, road_address, lot_number_address, latitude,
11-
longitude)
10+
INSERT INTO store (id, kakao_id, category, phone_number, name, place_url, road_address, lot_number_address, district,
11+
latitude, longitude)
1212
VALUES (1, '99999999999', 'KOREAN', '01012345678', '맛있는 한식집', 'https://place.map.kakao.com/17163273',
13-
'서울시 강남구 역삼동 123-45', '서울시 강남구 역삼동 123-45', 37.503708148482524, 127.05300772497776),
13+
'서울시 강남구 역삼동 123-45', '서울시 강남구 역삼동 123-45', 'GANGNAM', 37.503708148482524, 127.05300772497776),
1414
(2, '99999999998', 'WESTERN', '01087654321', '아름다운 양식집', 'https://place.map.kakao.com/17163273',
15-
'서울시 강남구 역삼동 67-89', '서울시 강남구 역삼동 67-89', 37.4979, 127.0276),
15+
'서울시 강남구 역삼동 67-89', '서울시 강남구 역삼동 67-89', 'GANGNAM', 37.4979, 127.0276),
1616
(3, '99999999997', 'CHINESE', '01045678912', '정통 중식당', 'https://place.map.kakao.com/17163273',
17-
'서울시 강남구 역삼동 101-112', '서울시 강남구 역삼동 101-112', 37.56259825108099, 126.97715943361476),
17+
'서울시 강남구 역삼동 101-112', '서울시 강남구 역삼동 101-112', 'GANGNAM', 37.56259825108099, 126.97715943361476),
1818
(4, '99999999996', 'WESTERN', '01078912345', '고급 양식 레스토랑', 'https://place.map.kakao.com/17163273', '',
19-
'서울시 강남구 역삼동 131-415', 37.4979, 127.0276),
19+
'서울시 강남구 역삼동 131-415', 'GANGNAM', 37.4979, 127.0276),
2020
(5, '99999999995', 'OTHER', '01034574568', '달콤한 디저트 카페', 'https://place.map.kakao.com/17163273',
21-
'서울시 강남구 역삼동 161-718', '서울시 강남구 역삼동 161-718', 37.49491300989233, 127.03150463098274),
21+
'서울시 강남구 역삼동 161-718', '서울시 강남구 역삼동 161-718', 'GANGNAM', 37.49491300989233, 127.03150463098274),
2222
(6, '99999999994', 'OTHER', '01043609998', '아늑한 커피숍', 'https://place.map.kakao.com/17163273',
23-
'서울시 강남구 역삼동 192-021', '서울시 강남구 역삼동 192-021', 37.5298343127044, 126.919484339847),
23+
'서울시 강남구 역삼동 192-021', '서울시 강남구 역삼동 192-021', 'GANGNAM', 37.5298343127044, 126.919484339847),
2424
(7, '99999999993', 'OTHER', '01065083298', '빠른 패스트푸드점', 'https://place.map.kakao.com/17163273', '',
25-
'서울시 강남구 역삼동 222-324', 37.5036675804016, 127.05305858911);
25+
'서울시 강남구 역삼동 222-324', 'GANGNAM', 37.5036675804016, 127.05305858911);
2626

2727
INSERT INTO cheer (id, member_id, store_id, description, image_key, is_admin)
2828
VALUES (1, 1, 1, '정말 맛있어요! 강추합니다!', 'cheer/dummy/1.jpg', true),

src/main/resources/db/seed/local/V2__local_init_data.sql

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,22 @@ VALUES (1, 123456789, '[email protected]', '이승로', '01012345678', true),
77
(6, 324569987, '[email protected]', '박희수', '01043609998', false),
88
(7, 323487985, '[email protected]', '하아얀', '01065083298', false);
99

10-
INSERT INTO store (id, kakao_id, category, phone_number, name, place_url, road_address, lot_number_address, latitude,
11-
longitude)
10+
INSERT INTO store (id, kakao_id, category, phone_number, name, place_url, road_address, lot_number_address, district,
11+
latitude, longitude)
1212
VALUES (1, '99999999999', 'KOREAN', '01012345678', '맛있는 한식집', 'https://place.map.kakao.com/17163273',
13-
'서울시 강남구 역삼동 123-45', '서울시 강남구 역삼동 123-45', 37.503708148482524, 127.05300772497776),
13+
'서울시 강남구 역삼동 123-45', '서울시 강남구 역삼동 123-45', 'GANGNAM', 37.503708148482524, 127.05300772497776),
1414
(2, '99999999998', 'WESTERN', '01087654321', '아름다운 양식집', 'https://place.map.kakao.com/17163273',
15-
'서울시 강남구 역삼동 67-89', '서울시 강남구 역삼동 67-89', 37.4979, 127.0276),
15+
'서울시 강남구 역삼동 67-89', '서울시 강남구 역삼동 67-89', 'GANGNAM', 37.4979, 127.0276),
1616
(3, '99999999997', 'CHINESE', '01045678912', '정통 중식당', 'https://place.map.kakao.com/17163273',
17-
'서울시 강남구 역삼동 101-112', '서울시 강남구 역삼동 101-112', 37.56259825108099, 126.97715943361476),
17+
'서울시 강남구 역삼동 101-112', '서울시 강남구 역삼동 101-112', 'GANGNAM', 37.56259825108099, 126.97715943361476),
1818
(4, '99999999996', 'WESTERN', '01078912345', '고급 양식 레스토랑', 'https://place.map.kakao.com/17163273', '',
19-
'서울시 강남구 역삼동 131-415', 37.4979, 127.0276),
19+
'서울시 강남구 역삼동 131-415', 'GANGNAM', 37.4979, 127.0276),
2020
(5, '99999999995', 'OTHER', '01034574568', '달콤한 디저트 카페', 'https://place.map.kakao.com/17163273',
21-
'서울시 강남구 역삼동 161-718', '서울시 강남구 역삼동 161-718', 37.49491300989233, 127.03150463098274),
21+
'서울시 강남구 역삼동 161-718', '서울시 강남구 역삼동 161-718', 'GANGNAM', 37.49491300989233, 127.03150463098274),
2222
(6, '99999999994', 'OTHER', '01043609998', '아늑한 커피숍', 'https://place.map.kakao.com/17163273',
23-
'서울시 강남구 역삼동 192-021', '서울시 강남구 역삼동 192-021', 37.5298343127044, 126.919484339847),
23+
'서울시 강남구 역삼동 192-021', '서울시 강남구 역삼동 192-021', 'GANGNAM', 37.5298343127044, 126.919484339847),
2424
(7, '99999999993', 'OTHER', '01065083298', '빠른 패스트푸드점', 'https://place.map.kakao.com/17163273', '',
25-
'서울시 강남구 역삼동 222-324', 37.5036675804016, 127.05305858911);
25+
'서울시 강남구 역삼동 222-324', 'GANGNAM', 37.5036675804016, 127.05305858911);
2626

2727
INSERT INTO cheer (id, member_id, store_id, description, image_key, is_admin)
2828
VALUES (1, 1, 1, '정말 맛있어요! 강추합니다!', 'cheer/dummy/1.jpg', true),

src/test/java/eatda/client/map/MapClientStoreSearchResultTest.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
import eatda.domain.store.StoreCategory;
66
import org.junit.jupiter.api.Nested;
77
import org.junit.jupiter.api.Test;
8+
import org.junit.jupiter.params.ParameterizedTest;
9+
import org.junit.jupiter.params.provider.NullAndEmptySource;
10+
import org.junit.jupiter.params.provider.ValueSource;
811

912
class MapClientStoreSearchResultTest {
1013

@@ -49,4 +52,46 @@ class GetStoreCategory {
4952
assertThat(category).isEqualTo(StoreCategory.OTHER);
5053
}
5154
}
55+
56+
@Nested
57+
class GetDistrict {
58+
59+
@Test
60+
void 제공된_지번_주소에_따라_해당_구를_반환한다() {
61+
MapClientStoreSearchResult store = new MapClientStoreSearchResult(
62+
"1062153333",
63+
"FD6",
64+
"음식점 > 한식 > 순대",
65+
"02-755-5232",
66+
"농민백암순대 시청직영점",
67+
"http://place.map.kakao.com/1062153333",
68+
"서울 중구 북창동 19-4",
69+
"서울 중구 남대문로1길 33",
70+
37.56259825108099,
71+
126.97715943361476
72+
);
73+
74+
assertThat(store.getDistrict()).isEqualTo(eatda.domain.store.District.JUNG);
75+
}
76+
77+
@ValueSource(strings = {" ", "\t", "이것은 주소가 아닙니다.", "empty"})
78+
@NullAndEmptySource
79+
@ParameterizedTest
80+
void 지번_주소가_정해진_형식이_아니면_ETC를_반환한다(String lotNumberAddress) {
81+
MapClientStoreSearchResult store = new MapClientStoreSearchResult(
82+
"1062153333",
83+
"FD6",
84+
"음식점 > 한식 > 순대",
85+
"02-755-5232",
86+
"농민백암순대 시청직영점",
87+
"http://place.map.kakao.com/1062153333",
88+
lotNumberAddress,
89+
null,
90+
37.56259825108099,
91+
126.97715943361476
92+
);
93+
94+
assertThat(store.getDistrict()).isEqualTo(eatda.domain.store.District.ETC);
95+
}
96+
}
5297
}

src/test/java/eatda/controller/cheer/CheerControllerTest.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import eatda.controller.BaseControllerTest;
77
import eatda.domain.cheer.Cheer;
88
import eatda.domain.member.Member;
9+
import eatda.domain.store.District;
910
import eatda.domain.store.Store;
1011
import eatda.util.ImageUtils;
1112
import eatda.util.MappingUtils;
@@ -21,7 +22,7 @@ class RegisterCheer {
2122

2223
@Test
2324
void 응원을_등록한다() {
24-
Store store = storeGenerator.generate("123", "서울시 노원구 월계3동 123-45");
25+
Store store = storeGenerator.generate("123", "서울시 노원구 월계3동 123-45", District.NOWON);
2526
CheerRegisterRequest request = new CheerRegisterRequest(store.getKakaoId(), store.getName(), "맛있어요!");
2627

2728
CheerResponse response = given()
@@ -40,7 +41,7 @@ class RegisterCheer {
4041

4142
@Test
4243
void 이미지가_비어있을_경우에도_응원을_등록한다() {
43-
Store store = storeGenerator.generate("123", "서울시 노원구 월계3동 123-45");
44+
Store store = storeGenerator.generate("123", "서울시 노원구 월계3동 123-45", District.NOWON);
4445
CheerRegisterRequest request = new CheerRegisterRequest(store.getKakaoId(), store.getName(), "맛있어요!");
4546

4647
CheerResponse response = given()
@@ -63,8 +64,8 @@ class GetCheers {
6364
@Test
6465
void 요청한_응원_중_최신_응원_N개를_조회한다() {
6566
Member member = memberGenerator.generateRegisteredMember("nickname", "[email protected]", "123", "01011111111");
66-
Store store1 = storeGenerator.generate("111", "서울시 노원구 월계3동 123-45");
67-
Store store2 = storeGenerator.generate("222", "서울시 성북구 석관동 123-45");
67+
Store store1 = storeGenerator.generate("111", "서울시 노원구 월계3동 123-45", District.NOWON);
68+
Store store2 = storeGenerator.generate("222", "서울시 성북구 석관동 123-45", District.SEONGBUK);
6869
LocalDateTime startAt = LocalDateTime.of(2025, 7, 26, 1, 0, 0);
6970
Cheer cheer1 = cheerGenerator.generateAdmin(member, store1, startAt);
7071
Cheer cheer2 = cheerGenerator.generateAdmin(member, store1, startAt.plusHours(1));
@@ -98,7 +99,7 @@ class GetCheersByStoreId {
9899
void 가게_아이디로_응원을_조회한다() throws InterruptedException {
99100
Member member1 = memberGenerator.generateRegisteredMember("123", "[email protected]", "1234", "01012341234");
100101
Member member2 = memberGenerator.generateRegisteredMember("124", "[email protected]", "1235", "01012341235");
101-
Store store = storeGenerator.generate("123", "서울시 강남구 역삼동 123-45");
102+
Store store = storeGenerator.generate("123", "서울시 강남구 역삼동 123-45", District.GANGNAM);
102103
Cheer cheer1 = cheerGenerator.generateCommon(member1, store);
103104
Thread.sleep(5);
104105
Cheer cheer2 = cheerGenerator.generateCommon(member2, store);

src/test/java/eatda/document/store/StoreDocumentTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import eatda.document.RestDocsRequest;
2020
import eatda.document.RestDocsResponse;
2121
import eatda.document.Tag;
22+
import eatda.domain.store.District;
2223
import eatda.domain.store.StoreCategory;
2324
import eatda.domain.store.StoreSearchResult;
2425
import eatda.exception.BusinessErrorCode;
@@ -247,9 +248,10 @@ class SearchStores {
247248
String query = "농민백암순대";
248249
List<StoreSearchResult> responses = List.of(
249250
new StoreSearchResult("123", StoreCategory.KOREAN, "010-1234-1234", "농민백암순대 본점",
250-
"https://yap.co.kr", "서울 강남구 대치동 896-33", "서울 강남구 선릉로86길 40-4", 37.0d, 128.0d),
251+
"https://yap.co.kr", "서울 강남구 대치동 896-33", "서울 강남구 선릉로86길 40-4", District.GANGNAM,
252+
37.0d, 128.0d),
251253
new StoreSearchResult("456", StoreCategory.KOREAN, "010-1234-1234", "농민백암순대 시청점",
252-
"https://yapp.kr", "서울 중구 북창동 19-4", null, 37.0d, 128.0d)
254+
"https://yapp.kr", "서울 중구 북창동 19-4", null, District.JUNG, 37.0d, 128.0d)
253255
);
254256
doReturn(responses).when(storeSearchService).searchStores(anyString());
255257

0 commit comments

Comments
 (0)