Skip to content

Commit a65f46b

Browse files
committed
refactor: 스토리 내부 가게 주소를 도로명과 지번으로 분리
1 parent e23c6e3 commit a65f46b

File tree

11 files changed

+167
-67
lines changed

11 files changed

+167
-67
lines changed

src/main/java/eatda/controller/story/FilteredSearchResult.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
public record FilteredSearchResult(
44
String kakaoId,
55
String name,
6-
String address,
6+
String roadAddress,
7+
String lotNumberAddress,
78
String category
89
) {
910
}

src/main/java/eatda/controller/story/StoryResponse.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ public record StoryResponse(
44
String storeKakaoId,
55
String category,
66
String storeName,
7-
String storeAddress,
7+
String storeDistrict,
8+
String storeNeighborhood,
89
String description,
910
String imageUrl
1011
) {

src/main/java/eatda/domain/story/Story.java

Lines changed: 46 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,11 @@ public class Story extends AuditingEntity {
3838
@Column(name = "store_name", nullable = false)
3939
private String storeName;
4040

41-
@Column(name = "store_address", nullable = false)
42-
private String storeAddress;
41+
@Column(name = "store_road_address", nullable = false)
42+
private String storeRoadAddress;
43+
44+
@Column(name = "store_lot_number_address", nullable = false)
45+
private String storeLotNumberAddress;
4346

4447
@Column(name = "store_category", nullable = false)
4548
private String storeCategory;
@@ -54,21 +57,23 @@ public class Story extends AuditingEntity {
5457
private Story(
5558
Member member,
5659
String storeKakaoId,
57-
String storeName,
58-
String storeAddress,
5960
String storeCategory,
61+
String storeName,
62+
String storeRoadAddress,
63+
String storeLotNumberAddress,
6064
String description,
6165
String imageKey
6266
) {
6367
validateMember(member);
64-
validateStore(storeKakaoId, storeName, storeAddress, storeCategory);
68+
validateStore(storeKakaoId, storeCategory, storeName, storeRoadAddress, storeLotNumberAddress);
6569
validateStory(description, imageKey);
6670

6771
this.member = member;
6872
this.storeKakaoId = storeKakaoId;
69-
this.storeName = storeName;
70-
this.storeAddress = storeAddress;
7173
this.storeCategory = storeCategory;
74+
this.storeName = storeName;
75+
this.storeRoadAddress = storeRoadAddress;
76+
this.storeLotNumberAddress = storeLotNumberAddress;
7277
this.description = description;
7378
this.imageKey = imageKey;
7479
}
@@ -79,11 +84,18 @@ private void validateMember(Member member) {
7984
}
8085
}
8186

82-
private void validateStore(String storeKakaoId, String storeName, String storeAddress, String storeCategory) {
87+
private void validateStore(
88+
String storeKakaoId,
89+
String storeCategory,
90+
String storeName,
91+
String roadAddress,
92+
String lotNumberAddress
93+
) {
8394
validateStoreKakaoId(storeKakaoId);
84-
validateStoreName(storeName);
85-
validateStoreAddress(storeAddress);
8695
validateStoreCategory(storeCategory);
96+
validateStoreName(storeName);
97+
validateStoreRoadAddress(roadAddress);
98+
validateStoreLotNumberAddress(lotNumberAddress);
8799
}
88100

89101
private void validateStory(String description, String imageKey) {
@@ -103,8 +115,14 @@ private void validateStoreName(String storeName) {
103115
}
104116
}
105117

106-
private void validateStoreAddress(String storeAddress) {
107-
if (storeAddress == null || storeAddress.isBlank()) {
118+
private void validateStoreRoadAddress(String roadAddress) {
119+
if (roadAddress == null || roadAddress.isBlank()) {
120+
throw new BusinessException(BusinessErrorCode.INVALID_STORE_ADDRESS);
121+
}
122+
}
123+
124+
private void validateStoreLotNumberAddress(String lotNumberAddress) {
125+
if (lotNumberAddress == null || lotNumberAddress.isBlank()) {
108126
throw new BusinessException(BusinessErrorCode.INVALID_STORE_ADDRESS);
109127
}
110128
}
@@ -126,4 +144,20 @@ private void validateImage(String imageKey) {
126144
throw new BusinessException(BusinessErrorCode.INVALID_STORY_IMAGE_KEY);
127145
}
128146
}
147+
148+
public String getAddressDistrict() {
149+
String[] addressParts = storeLotNumberAddress.split(" ");
150+
if (addressParts.length < 2) {
151+
return "";
152+
}
153+
return addressParts[1];
154+
}
155+
156+
public String getAddressNeighborhood() {
157+
String[] addressParts = storeLotNumberAddress.split(" ");
158+
if (addressParts.length < 3) {
159+
return "";
160+
}
161+
return addressParts[2];
162+
}
129163
}

src/main/java/eatda/service/story/StoryService.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ public void registerStory(StoryRegisterRequest request, MultipartFile image, Lon
4444
.member(member)
4545
.storeKakaoId(matchedStore.kakaoId())
4646
.storeName(matchedStore.name())
47-
.storeAddress(matchedStore.address())
47+
.storeRoadAddress(matchedStore.roadAddress())
48+
.storeLotNumberAddress(matchedStore.lotNumberAddress())
4849
.storeCategory(matchedStore.category())
4950
.description(request.description())
5051
.imageKey(imageKey)
@@ -61,6 +62,7 @@ private FilteredSearchResult filteredSearchResponse(List<StoreSearchResult> resp
6162
store.kakaoId(),
6263
store.name(),
6364
store.roadAddress(),
65+
store.lotNumberAddress(),
6466
store.categoryName()
6567
))
6668
.orElseThrow(() -> new BusinessException(BusinessErrorCode.STORE_NOT_FOUND));
@@ -90,7 +92,8 @@ public StoryResponse getStory(long storyId) {
9092
story.getStoreKakaoId(),
9193
story.getStoreCategory(),
9294
story.getStoreName(),
93-
story.getStoreAddress(),
95+
story.getAddressDistrict(),
96+
story.getAddressNeighborhood(),
9497
story.getDescription(),
9598
imageService.getPresignedUrl(story.getImageKey())
9699
);
Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
CREATE TABLE `story`
22
(
3-
`id` BIGINT NOT NULL AUTO_INCREMENT,
4-
`member_id` BIGINT NOT NULL,
5-
`store_kakao_id` VARCHAR(255) NOT NULL,
6-
`store_name` VARCHAR(255) NOT NULL,
7-
`store_address` VARCHAR(255) NOT NULL,
8-
`store_category` VARCHAR(50) NOT NULL,
9-
`description` TEXT NOT NULL,
10-
`image_key` VARCHAR(511) NOT NULL,
11-
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
3+
`id` BIGINT NOT NULL AUTO_INCREMENT,
4+
`member_id` BIGINT NOT NULL,
5+
`store_kakao_id` VARCHAR(255) NOT NULL,
6+
`store_name` VARCHAR(255) NOT NULL,
7+
`store_road_address` VARCHAR(255) NOT NULL,
8+
`store_lot_number_address` VARCHAR(255) NOT NULL,
9+
`store_category` VARCHAR(50) NOT NULL,
10+
`description` TEXT NOT NULL,
11+
`image_key` VARCHAR(511) NOT NULL,
12+
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
1213
PRIMARY KEY (`id`)
1314
);
Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
1-
INSERT INTO story (member_id, store_kakao_id, store_name, store_address,
2-
store_category, description, image_key)
3-
VALUES (1, '99999999999', '맛있는 한식집', '서울시 강남구 역삼동 123-45', 'KOREAN', '진짜 여기 곱창 맛집임. 다시 또 갈 듯!', 'story/dummy/1.jpg'),
4-
(2, '99999999998', '아름다운 양식집', '서울시 강남구 역삼동 67-89', 'WESTERN', '스테이크가 부드럽고 서비스도 좋아요.', 'story/dummy/2.jpg'),
5-
(3, '99999999997', '정통 중식당', '서울시 강남구 역삼동 101-112', 'CHINESE', '짜장면이 정통의 맛. 강력 추천.', 'story/dummy/3.jpg');
1+
INSERT INTO story (member_id,
2+
store_kakao_id,
3+
store_name,
4+
store_road_address,
5+
store_lot_number_address,
6+
store_category,
7+
description,
8+
image_key)
9+
VALUES (1, '99999999999', '맛있는 한식집', '서울시 강남구 테헤란로 123', '서울시 강남구 역삼동 123-45', 'KOREAN', '진짜 여기 곱창 맛집임. 다시 또 갈 듯!',
10+
'story/dummy/1.jpg'),
11+
(2, '99999999998', '아름다운 양식집', '서울시 강남구 테헤란로 67', '서울시 강남구 역삼동 67-89', 'WESTERN', '스테이크가 부드럽고 서비스도 좋아요.',
12+
'story/dummy/2.jpg'),
13+
(3, '99999999997', '정통 중식당', '서울시 강남구 봉은사로 101', '서울시 강남구 역삼동 101-112', 'CHINESE', '짜장면이 정통의 맛. 강력 추천.',
14+
'story/dummy/3.jpg');
Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,22 @@
1-
INSERT INTO story (member_id, store_kakao_id, store_name, store_address,
2-
store_category, description, image_key)
3-
VALUES (1, '99999999999', '맛있는 한식집', '서울시 강남구 역삼동 123-45', 'KOREAN', '진짜 여기 곱창 맛집임. 다시 또 갈 듯!', 'story/dummy/1.jpg'),
4-
(2, '99999999998', '아름다운 양식집', '서울시 강남구 역삼동 67-89', 'WESTERN', '스테이크가 부드럽고 서비스도 좋아요.', 'story/dummy/2.jpg'),
5-
(3, '99999999997', '정통 중식당', '서울시 강남구 역삼동 101-112', 'CHINESE', '짜장면이 정통의 맛. 강력 추천.', 'story/dummy/3.jpg'),
6-
(4, '99999999996', '고급 양식 레스토랑', '서울시 강남구 역삼동 131-415', 'WESTERN', '분위기가 연인 데이트하기 좋아요.', 'story/dummy/4.jpg'),
7-
(5, '99999999995', '달콤한 디저트 카페', '서울시 강남구 역삼동 161-718', 'ETC', '케이크가 촉촉하고 맛있어요.', 'story/dummy/5.jpg'),
8-
(6, '99999999994', '아늑한 카페', '서울시 강남구 역삼동 192-021', 'ETC', '조용해서 공부하기 좋아요.', 'story/dummy/6.jpg'),
9-
(7, '99999999993', '빠른 패스트푸드점', '서울시 강남구 역삼동 222-324', 'ETC', '햄버거 나오는데 3분도 안 걸림. 굿.', 'story/dummy/7.jpg');
1+
INSERT INTO story (member_id,
2+
store_kakao_id,
3+
store_name,
4+
store_road_address,
5+
store_lot_number_address,
6+
store_category,
7+
description,
8+
image_key)
9+
VALUES (1, '99999999999', '맛있는 한식집', '서울시 강남구 테헤란로 123', '서울시 강남구 역삼동 123-45', 'KOREAN', '진짜 여기 곱창 맛집임. 다시 또 갈 듯!',
10+
'story/dummy/1.jpg'),
11+
(2, '99999999998', '아름다운 양식집', '서울시 강남구 테헤란로 67', '서울시 강남구 역삼동 67-89', 'WESTERN', '스테이크가 부드럽고 서비스도 좋아요.',
12+
'story/dummy/2.jpg'),
13+
(3, '99999999997', '정통 중식당', '서울시 강남구 봉은사로 101', '서울시 강남구 역삼동 101-112', 'CHINESE', '짜장면이 정통의 맛. 강력 추천.',
14+
'story/dummy/3.jpg'),
15+
(4, '99999999996', '고급 양식 레스토랑', '서울시 강남구 언주로 131', '서울시 강남구 역삼동 131-415', 'WESTERN', '분위기가 연인 데이트하기 좋아요.',
16+
'story/dummy/4.jpg'),
17+
(5, '99999999995', '달콤한 디저트 카페', '서울시 강남구 논현로 161', '서울시 강남구 역삼동 161-718', 'ETC', '케이크가 촉촉하고 맛있어요.',
18+
'story/dummy/5.jpg'),
19+
(6, '99999999994', '아늑한 카페', '서울시 강남구 선릉로 192', '서울시 강남구 역삼동 192-021', 'ETC', '조용해서 공부하기 좋아요.',
20+
'story/dummy/6.jpg'),
21+
(7, '99999999993', '빠른 패스트푸드점', '서울시 강남구 도산대로 222', '서울시 강남구 역삼동 222-324', 'ETC', '햄버거 나오는데 3분도 안 걸림. 굿.',
22+
'story/dummy/7.jpg');

src/test/java/eatda/controller/story/StoryControllerTest.java

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package eatda.controller.story;
22

3+
import static org.assertj.core.api.Assertions.assertThat;
34
import static org.hamcrest.Matchers.equalTo;
5+
import static org.junit.jupiter.api.Assertions.assertAll;
46
import static org.mockito.ArgumentMatchers.any;
57
import static org.mockito.Mockito.doNothing;
68
import static org.mockito.Mockito.doReturn;
@@ -66,16 +68,18 @@ class GetStories {
6668
.when(storyService)
6769
.getPagedStoryPreviews(5);
6870

69-
Response response = given()
71+
StoriesResponse response = given()
7072
.queryParam("size", 5)
7173
.when()
72-
.get("/api/stories");
73-
74-
response.then()
75-
.statusCode(200)
76-
.body("stories.size()", equalTo(2))
77-
.body("stories[0].storyId", equalTo(1))
78-
.body("stories[0].imageUrl", equalTo("https://s3.bucket.com/story/dummy/1.jpg"));
74+
.get("/api/stories")
75+
.then().statusCode(200)
76+
.extract().as(StoriesResponse.class);
77+
78+
assertAll(
79+
() -> assertThat(response.stories()).hasSize(2),
80+
() -> assertThat(response.stories().getFirst().storyId()).isEqualTo(1L),
81+
() -> assertThat(response.stories().getFirst().imageUrl()).isEqualTo("https://s3.bucket.com/story/dummy/1.jpg")
82+
);
7983
}
8084
}
8185

@@ -90,7 +94,8 @@ class GetStory {
9094
"123456",
9195
"한식",
9296
"진또곱창집",
93-
"서울특별시 성동구 성수동1가",
97+
"성동구",
98+
"성수동",
9499
"곱창은 여기",
95100
"https://s3.bucket.com/story1.jpg"
96101
)).when(storyService).getStory(storyId);
@@ -105,7 +110,8 @@ class GetStory {
105110
.body("storeKakaoId", equalTo("123456"))
106111
.body("category", equalTo("한식"))
107112
.body("storeName", equalTo("진또곱창집"))
108-
.body("storeAddress", equalTo("서울특별시 성동구 성수동1가"))
113+
.body("storeDistrict", equalTo("성동구"))
114+
.body("storeNeighborhood", equalTo("성수동"))
109115
.body("description", equalTo("곱창은 여기"))
110116
.body("imageUrl", equalTo("https://s3.bucket.com/story1.jpg"));
111117
}

src/test/java/eatda/document/story/StoryDocumentTest.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,8 @@ class GetStory {
189189
fieldWithPath("storeKakaoId").description("가게의 카카오 ID"),
190190
fieldWithPath("category").description("가게 카테고리"),
191191
fieldWithPath("storeName").description("가게 이름"),
192-
fieldWithPath("storeAddress").description("가게 주소"),
192+
fieldWithPath("storeDistrict").description("가게 주소의 구"),
193+
fieldWithPath("storeNeighborhood").description("가게 주소의 동"),
193194
fieldWithPath("description").description("스토리 내용"),
194195
fieldWithPath("imageUrl").description("스토리 이미지 URL")
195196
);
@@ -202,7 +203,8 @@ class GetStory {
202203
"123456",
203204
"한식",
204205
"진또곱창집",
205-
"서울특별시 성동구 성수동1가",
206+
"성동구",
207+
"성수동",
206208
"곱창은 여기",
207209
"https://s3.bucket.com/story1.jpg"
208210
)).when(storyService).getStory(storyId);
@@ -222,7 +224,8 @@ class GetStory {
222224
.body("storeKakaoId", equalTo("123456"))
223225
.body("category", equalTo("한식"))
224226
.body("storeName", equalTo("진또곱창집"))
225-
.body("storeAddress", equalTo("서울특별시 성동구 성수동1가"))
227+
.body("storeDistrict", equalTo("성동구"))
228+
.body("storeNeighborhood", equalTo("성수동"))
226229
.body("description", equalTo("곱창은 여기"))
227230
.body("imageUrl", equalTo("https://s3.bucket.com/story1.jpg"));
228231
}

0 commit comments

Comments
 (0)