Skip to content

Commit 3e8262d

Browse files
authored
Merge 9842485 into 74386de
2 parents 74386de + 9842485 commit 3e8262d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+1382
-589
lines changed

build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ dependencies {
7474

7575
// pdf parsing
7676
implementation 'org.apache.pdfbox:pdfbox:3.0.5'
77+
78+
// db migration
79+
implementation 'org.flywaydb:flyway-core'
80+
implementation 'org.flywaydb:flyway-mysql'
81+
7782
}
7883

7984
dependencyManagement {

src/main/java/sevenstar/marineleisure/favorite/service/FavoriteServiceImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import sevenstar.marineleisure.favorite.repository.FavoriteRepository;
1717
import sevenstar.marineleisure.global.exception.CustomException;
1818
import sevenstar.marineleisure.global.exception.enums.FavoriteErrorCode;
19+
import sevenstar.marineleisure.global.exception.enums.SpotErrorCode;
1920
import sevenstar.marineleisure.spot.domain.OutdoorSpot;
2021
import sevenstar.marineleisure.spot.repository.OutdoorSpotRepository;
2122

@@ -45,9 +46,8 @@ public FavoriteSpot searchFavoriteById(Long id) {
4546
@Transactional
4647
public Long createFavorite(Long id) {
4748
Long currentMemberId = getCurrentUserId();
48-
// 우선 즐겨찾기를 못찾았다고 넣었지만, 나중에 Spot에러코드 추가되면 그걸로 교체 예정입니다.
4949
OutdoorSpot outdoorSpot = spotRepository.findById(id)
50-
.orElseThrow(() -> new CustomException(FavoriteErrorCode.FAVORITE_NOT_FOUND));
50+
.orElseThrow(() -> new CustomException(SpotErrorCode.SPOT_NOT_FOUND));
5151

5252
FavoriteSpot createdFavoriteSpot = FavoriteSpot.builder()
5353
.memberId(currentMemberId)
Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,32 @@
11
package sevenstar.marineleisure.global.api.config;
22

3+
import org.springframework.beans.factory.annotation.Qualifier;
4+
import org.springframework.beans.factory.annotation.Value;
35
import org.springframework.context.annotation.Bean;
46
import org.springframework.context.annotation.Configuration;
7+
import org.springframework.http.client.ClientHttpRequestInterceptor;
58
import org.springframework.web.client.RestTemplate;
69

710
@Configuration
811
public class RestTemplateConfig {
12+
@Value("${kakao.login.api_key}")
13+
private String kakaoRestApiKey;
914

1015
@Bean
11-
public RestTemplate restTemplate() {
16+
public RestTemplate apiRestTemplate() {
1217
return new RestTemplate();
1318
}
19+
20+
@Bean
21+
public RestTemplate kakaoRestTemplate() {
22+
RestTemplate restTemplate = new RestTemplate();
23+
24+
ClientHttpRequestInterceptor interceptor = (request, body, execution) -> {
25+
request.getHeaders().add("Authorization", String.format("KakaoAK %s", kakaoRestApiKey));
26+
return execution.execute(request, body);
27+
};
28+
29+
restTemplate.getInterceptors().add(interceptor);
30+
return restTemplate;
31+
}
1432
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package sevenstar.marineleisure.global.api.kakao;
2+
3+
import java.net.URI;
4+
5+
import org.springframework.beans.factory.annotation.Qualifier;
6+
import org.springframework.beans.factory.annotation.Value;
7+
import org.springframework.http.HttpMethod;
8+
import org.springframework.http.ResponseEntity;
9+
import org.springframework.stereotype.Component;
10+
import org.springframework.util.LinkedMultiValueMap;
11+
import org.springframework.util.MultiValueMap;
12+
import org.springframework.web.client.RestTemplate;
13+
14+
import lombok.RequiredArgsConstructor;
15+
import sevenstar.marineleisure.global.api.kakao.dto.RegionResponse;
16+
import sevenstar.marineleisure.global.utils.UriBuilder;
17+
18+
@Component
19+
@RequiredArgsConstructor
20+
public class KakaoApiClient {
21+
@Value("${kakao.map.uri}")
22+
private String kakaoMapUri;
23+
24+
private final RestTemplate kakaoRestTemplate;
25+
26+
public ResponseEntity<RegionResponse> get(float latitude, float longitude) {
27+
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
28+
params.add("y", String.valueOf(latitude));
29+
params.add("x", String.valueOf(longitude));
30+
31+
URI uri = UriBuilder.buildQueryParameter(kakaoMapUri, params);
32+
33+
return kakaoRestTemplate.exchange(uri, HttpMethod.GET, null, RegionResponse.class);
34+
}
35+
36+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package sevenstar.marineleisure.global.api.kakao.dto;
2+
3+
import java.util.List;
4+
5+
import lombok.Data;
6+
7+
@Data
8+
public class RegionResponse {
9+
private Meta meta;
10+
private List<Document> documents;
11+
12+
@Data
13+
public static class Meta {
14+
private int total_count;
15+
}
16+
17+
@Data
18+
public static class Document {
19+
private String region_type;
20+
private String code;
21+
private String address_name;
22+
private String region_1depth_name;
23+
private String region_2depth_name;
24+
private String region_3depth_name;
25+
private String region_4depth_name;
26+
private double x;
27+
private double y;
28+
}
29+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package sevenstar.marineleisure.global.api.kakao.service;
2+
3+
import java.time.LocalDate;
4+
5+
import org.springframework.stereotype.Service;
6+
7+
import lombok.RequiredArgsConstructor;
8+
import sevenstar.marineleisure.global.enums.Region;
9+
import sevenstar.marineleisure.global.enums.TotalIndex;
10+
import sevenstar.marineleisure.spot.domain.BestSpot;
11+
import sevenstar.marineleisure.spot.repository.OutdoorSpotRepository;
12+
import sevenstar.marineleisure.spot.repository.SpotPresetRepository;
13+
14+
@Service
15+
@RequiredArgsConstructor
16+
public class PresetSchedulerService {
17+
private static final double PRESET_RADIUS = 200_000;
18+
private final OutdoorSpotRepository outdoorSpotRepository;
19+
private final SpotPresetRepository spotPresetRepository;
20+
21+
public void updateRegionApi() {
22+
LocalDate now = LocalDate.now();
23+
BestSpot emptySpot = new BestSpot(-1L, "없는 지역입니다", TotalIndex.NONE);
24+
for (Region region : Region.getAllKoreaRegion()) {
25+
BestSpot bestSpotInFishing = outdoorSpotRepository.findBestSpotInFishing(region.getLatitude(),
26+
region.getLongitude(), now, PRESET_RADIUS).map(BestSpot::new).orElse(emptySpot);
27+
BestSpot bestSpotInMudflat = outdoorSpotRepository.findBestSpotInMudflat(region.getLatitude(),
28+
region.getLongitude(), now, PRESET_RADIUS).map(BestSpot::new).orElse(emptySpot);
29+
BestSpot bestSpotInScuba = outdoorSpotRepository.findBestSpotInScuba(region.getLatitude(),
30+
region.getLongitude(), now, PRESET_RADIUS).map(BestSpot::new).orElse(emptySpot);
31+
BestSpot bestSpotInSurfing = outdoorSpotRepository.findBestSpotInSurfing(region.getLatitude(),
32+
region.getLongitude(), now, PRESET_RADIUS).map(BestSpot::new).orElse(emptySpot);
33+
34+
spotPresetRepository.upsert(region.name(), bestSpotInFishing.getSpotId(), bestSpotInFishing.getName(),
35+
bestSpotInFishing.getTotalIndex().name(), bestSpotInMudflat.getSpotId(), bestSpotInMudflat.getName(),
36+
bestSpotInMudflat.getTotalIndex().name(), bestSpotInScuba.getSpotId(), bestSpotInScuba.getName(),
37+
bestSpotInScuba.getTotalIndex().name(), bestSpotInSurfing.getSpotId(), bestSpotInSurfing.getName(),
38+
bestSpotInSurfing.getTotalIndex().name());
39+
}
40+
}
41+
}

src/main/java/sevenstar/marineleisure/global/api/khoa/KhoaApiClient.java

Lines changed: 11 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111

1212
import lombok.RequiredArgsConstructor;
1313
import sevenstar.marineleisure.global.api.config.properties.KhoaProperties;
14-
import sevenstar.marineleisure.global.api.khoa.dto.common.ApiResponse;
15-
import sevenstar.marineleisure.global.api.khoa.dto.item.FishingItem;
1614
import sevenstar.marineleisure.global.enums.ActivityCategory;
1715
import sevenstar.marineleisure.global.enums.FishingType;
1816
import sevenstar.marineleisure.global.utils.DateUtils;
@@ -21,11 +19,11 @@
2119
@Component
2220
@RequiredArgsConstructor
2321
public class KhoaApiClient {
24-
private final RestTemplate restTemplate;
22+
private final RestTemplate apiRestTemplate;
2523
private final KhoaProperties khoaProperties;
2624

2725
/**
28-
* khoa api get 요청(갯벌체험, 서핑, 스쿠버다이빙)
26+
* khoa api get 요청(낚시, 갯벌체험, 서핑, 스쿠버다이빙)
2927
* @param responseType response 타입
3028
* @param reqDate 요청 일자
3129
* @param page
@@ -35,31 +33,16 @@ public class KhoaApiClient {
3533
* @param <T>
3634
*/
3735
public <T> ResponseEntity<T> get(ParameterizedTypeReference<T> responseType, LocalDate reqDate, int page, int size,
38-
ActivityCategory category) {
36+
ActivityCategory category, FishingType gubun) {
37+
URI uri;
3938
if (category == ActivityCategory.FISHING) {
40-
// TODO : handling exception
41-
// throw new IllegalAccessException();
39+
uri = UriBuilder.buildQueryParameter(khoaProperties.getBaseUrl(),
40+
khoaProperties.getPath(ActivityCategory.FISHING),
41+
khoaProperties.getParams(DateUtils.formatTime(reqDate), page, size, gubun.getDescription()));
42+
} else {
43+
uri = UriBuilder.buildQueryParameter(khoaProperties.getBaseUrl(), khoaProperties.getPath(category),
44+
khoaProperties.getParams(DateUtils.formatTime(reqDate), page, size));
4245
}
43-
URI uri = UriBuilder.buildQueryParameter(khoaProperties.getBaseUrl(), khoaProperties.getPath(category),
44-
khoaProperties.getParams(DateUtils.formatTime(reqDate), page, size));
45-
return restTemplate.exchange(uri, HttpMethod.GET, null, responseType);
46+
return apiRestTemplate.exchange(uri, HttpMethod.GET, null, responseType);
4647
}
47-
48-
/**
49-
* khoa api get 요청(낚시)
50-
* @param responseType response 타입
51-
* @param reqDate 요청 일자
52-
* @param page
53-
* @param size
54-
* @param gubun 선상 / 갯바위 중 하나
55-
* @return response
56-
*/
57-
public ResponseEntity<ApiResponse<FishingItem>> get(
58-
ParameterizedTypeReference<ApiResponse<FishingItem>> responseType, LocalDate reqDate, int page, int size,
59-
FishingType gubun) {
60-
URI uri = UriBuilder.buildQueryParameter(khoaProperties.getBaseUrl(),
61-
khoaProperties.getPath(ActivityCategory.FISHING), khoaProperties.getParams(DateUtils.formatTime(reqDate), page, size, gubun.getDescription()));
62-
return restTemplate.exchange(uri, HttpMethod.GET, null, responseType);
63-
}
64-
6548
}

src/main/java/sevenstar/marineleisure/global/api/khoa/dto/item/FishingItem.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
import java.time.LocalDate;
55

66
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
78
import sevenstar.marineleisure.global.enums.ActivityCategory;
89
import sevenstar.marineleisure.global.utils.DateUtils;
910

1011
@Getter
12+
@NoArgsConstructor
1113
public class FishingItem implements KhoaItem {
1214
private String seafsPstnNm;
1315
private double lat;

src/main/java/sevenstar/marineleisure/global/api/khoa/dto/item/MudflatItem.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
import java.time.LocalDate;
55

66
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
78
import sevenstar.marineleisure.global.enums.ActivityCategory;
89
import sevenstar.marineleisure.global.utils.DateUtils;
910

1011
@Getter
12+
@NoArgsConstructor
1113
public class MudflatItem implements KhoaItem {
1214
private String mdftExpcnVlgNm; // 마을 이름
1315
private double lat; // 위도

src/main/java/sevenstar/marineleisure/global/api/khoa/dto/item/ScubaItem.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
import java.time.LocalDate;
55

66
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
78
import sevenstar.marineleisure.global.enums.ActivityCategory;
89
import sevenstar.marineleisure.global.utils.DateUtils;
910

1011
@Getter
12+
@NoArgsConstructor
1113
public class ScubaItem implements KhoaItem {
1214
private String skscExpcnRgnNm; // 체험 지역명
1315
private double lat; // 위도

0 commit comments

Comments
 (0)