From ce03802ac615e991b2f951b07c80c73b98d6e371 Mon Sep 17 00:00:00 2001 From: summit45 Date: Mon, 13 Nov 2023 19:19:23 +0900 Subject: [PATCH 01/10] =?UTF-8?q?chore:=20application-local=20gitignore=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index b06c536..a3649d1 100644 --- a/.gitignore +++ b/.gitignore @@ -41,4 +41,7 @@ out/ rebel.xml ### .DS_Store ### -.DS_Store \ No newline at end of file +.DS_Store + +### application.yml ### +src/main/resources/application-local.yml \ No newline at end of file From 001391a08114954b3074dfd0a786c6d5d29ad6e5 Mon Sep 17 00:00:00 2001 From: summit45 Date: Mon, 13 Nov 2023 19:22:06 +0900 Subject: [PATCH 02/10] =?UTF-8?q?chore:=20googleCode=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 79ab719..906a8cf 100644 --- a/build.gradle +++ b/build.gradle @@ -68,7 +68,9 @@ dependencies { annotationProcessor "jakarta.persistence:jakarta.persistence-api" //s3 bucket (img) implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' - + //json-simple + implementation group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1' + implementation 'org.json:json:20210307' testImplementation 'org.springframework.boot:spring-boot-starter-test' } From 557d3518622f689e1588d63080946fad193f2de9 Mon Sep 17 00:00:00 2001 From: summit45 Date: Mon, 13 Nov 2023 19:48:46 +0900 Subject: [PATCH 03/10] =?UTF-8?q?feat:=20geocoding=20api=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jipbap/user/UserAddressService.java | 85 +++++++++++++++++++ .../dto/geolocation/AddressComponentDto.java | 19 +++++ .../dto/geolocation/GeocodingAddressDto.java | 23 +++++ .../dto/geolocation/GeocodingResponseDto.java | 13 +++ .../dto/geolocation/GeometryBoundsDto.java | 12 +++ .../user/dto/geolocation/GeometryDto.java | 11 +++ .../dto/geolocation/GeometryLocationDto.java | 11 +++ .../user/dto/geolocation/PlusCodeDto.java | 11 +++ src/main/resources/application.yml | 3 +- 9 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/kusitms/jipbap/user/UserAddressService.java create mode 100644 src/main/java/com/kusitms/jipbap/user/dto/geolocation/AddressComponentDto.java create mode 100644 src/main/java/com/kusitms/jipbap/user/dto/geolocation/GeocodingAddressDto.java create mode 100644 src/main/java/com/kusitms/jipbap/user/dto/geolocation/GeocodingResponseDto.java create mode 100644 src/main/java/com/kusitms/jipbap/user/dto/geolocation/GeometryBoundsDto.java create mode 100644 src/main/java/com/kusitms/jipbap/user/dto/geolocation/GeometryDto.java create mode 100644 src/main/java/com/kusitms/jipbap/user/dto/geolocation/GeometryLocationDto.java create mode 100644 src/main/java/com/kusitms/jipbap/user/dto/geolocation/PlusCodeDto.java diff --git a/src/main/java/com/kusitms/jipbap/user/UserAddressService.java b/src/main/java/com/kusitms/jipbap/user/UserAddressService.java new file mode 100644 index 0000000..7ebb890 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/UserAddressService.java @@ -0,0 +1,85 @@ +package com.kusitms.jipbap.user; + +import com.kusitms.jipbap.user.dto.geolocation.AddressComponentDto; +import com.kusitms.jipbap.user.dto.geolocation.GeocodingAddressDto; +import com.kusitms.jipbap.user.dto.geolocation.GeocodingResponseDto; +import com.kusitms.jipbap.user.exception.GeocodingConnectionException; +import com.kusitms.jipbap.user.exception.GeocodingUnknownAdressException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.client.RestTemplate; + +import java.util.List; + +@Slf4j +@Service +@RequiredArgsConstructor +public class UserAddressService { + @Value("${secret.geocodingApiKey}") + private String apiKey; + + @Transactional + public void getGeoDataByAddress(String address){ + JSONObject geocodingData = getGeocodingData(address); + } + + private JSONObject getGeocodingData(String address) { + try { + String apiUrl = "https://maps.googleapis.com/maps/api/geocode/json?address=" + address + "&key=" + apiKey; + + RestTemplate restTemplate = new RestTemplate(); + GeocodingResponseDto responseDto = restTemplate.getForObject(apiUrl, GeocodingResponseDto.class); + //String response = restTemplate.getForObject(apiUrl, String.class); + log.info("{} 주소에 대한 getGeocodingData API response 결과 : {} ", address, responseDto.getStatus()); + + if ("OK".equals(responseDto.getStatus())) { + saveUserAddress(responseDto.getResults().get(0)); + } else if ("ZERO_RESULTS".equals(responseDto.getStatus())){ + throw new GeocodingUnknownAdressException("주소가 존재하지 않습니다."); + } else if ("OVER_DAILY_LIMIT".equals(responseDto.getStatus())) { + throw new GeocodingConnectionException("API키가 잘못되었거나 결제가 사용 설정 되지 않았습니다."); + } else if ("OVER_QUERY_LIMIT".equals(responseDto.getStatus())) { + throw new GeocodingConnectionException("할당량이 초과되었습니다."); + } else if ("REQUEST_DENIED".equals(responseDto.getStatus())) { + throw new GeocodingConnectionException("요청이 거부되었습니다."); + } else if ("INVALID_REQUEST".equals(responseDto.getStatus())) { + throw new GeocodingUnknownAdressException("쿼리가 누락되었습니다."); + } else if ("UNKNOWN_ERROR".equals(responseDto.getStatus())) { + throw new GeocodingConnectionException("서버 에러입니다."); + } else { + throw new GeocodingConnectionException("그 외의 오류가 발생했습니다."); + } + return new JSONObject(responseDto); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + private void saveUserAddress(GeocodingAddressDto geocodingAddressDto) { + try { + String formattedAddress = geocodingAddressDto.getFormattedAddress(); // 실제 데이터베이스에 저장할 주소 + + Double lat = geocodingAddressDto.getGeometry().getLocation().getLat(); + Double lng = geocodingAddressDto.getGeometry().getLocation().getLng(); + + String countryName = null; + String postalCode = null; + for (AddressComponentDto addressComponent : geocodingAddressDto.getAddressComponentList()) { + List types = addressComponent.getTypes(); + if (types != null && types.contains("country")) { + countryName = addressComponent.getLongName(); + } + if (types != null && types.contains("postal_code")) { + postalCode= addressComponent.getLongName(); + } + } + } catch (NullPointerException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/kusitms/jipbap/user/dto/geolocation/AddressComponentDto.java b/src/main/java/com/kusitms/jipbap/user/dto/geolocation/AddressComponentDto.java new file mode 100644 index 0000000..4fbb7ec --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/dto/geolocation/AddressComponentDto.java @@ -0,0 +1,19 @@ +package com.kusitms.jipbap.user.dto.geolocation; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class AddressComponentDto { + @JsonProperty("long_name") + private String longName; + + @JsonProperty("short_name") + private String shortName; + + private List types; +} \ No newline at end of file diff --git a/src/main/java/com/kusitms/jipbap/user/dto/geolocation/GeocodingAddressDto.java b/src/main/java/com/kusitms/jipbap/user/dto/geolocation/GeocodingAddressDto.java new file mode 100644 index 0000000..6783f18 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/dto/geolocation/GeocodingAddressDto.java @@ -0,0 +1,23 @@ +package com.kusitms.jipbap.user.dto.geolocation; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class GeocodingAddressDto { + @JsonProperty("address_components") + private List addressComponentList; + + @JsonProperty("formatted_address") + private String formattedAddress; + + private GeometryDto geometry; + + private String placeId; + + @JsonProperty("types") + private List typeList; +} diff --git a/src/main/java/com/kusitms/jipbap/user/dto/geolocation/GeocodingResponseDto.java b/src/main/java/com/kusitms/jipbap/user/dto/geolocation/GeocodingResponseDto.java new file mode 100644 index 0000000..577a2a6 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/dto/geolocation/GeocodingResponseDto.java @@ -0,0 +1,13 @@ +package com.kusitms.jipbap.user.dto.geolocation; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class GeocodingResponseDto { + private List results; + private String status; +} \ No newline at end of file diff --git a/src/main/java/com/kusitms/jipbap/user/dto/geolocation/GeometryBoundsDto.java b/src/main/java/com/kusitms/jipbap/user/dto/geolocation/GeometryBoundsDto.java new file mode 100644 index 0000000..6bf8053 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/dto/geolocation/GeometryBoundsDto.java @@ -0,0 +1,12 @@ +package com.kusitms.jipbap.user.dto.geolocation; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class GeometryBoundsDto { + private GeometryLocationDto northeast; + private GeometryLocationDto southwest; + +} \ No newline at end of file diff --git a/src/main/java/com/kusitms/jipbap/user/dto/geolocation/GeometryDto.java b/src/main/java/com/kusitms/jipbap/user/dto/geolocation/GeometryDto.java new file mode 100644 index 0000000..db2db15 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/dto/geolocation/GeometryDto.java @@ -0,0 +1,11 @@ +package com.kusitms.jipbap.user.dto.geolocation; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class GeometryDto { + private GeometryLocationDto location; + private String locationType; +} \ No newline at end of file diff --git a/src/main/java/com/kusitms/jipbap/user/dto/geolocation/GeometryLocationDto.java b/src/main/java/com/kusitms/jipbap/user/dto/geolocation/GeometryLocationDto.java new file mode 100644 index 0000000..d168ccc --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/dto/geolocation/GeometryLocationDto.java @@ -0,0 +1,11 @@ +package com.kusitms.jipbap.user.dto.geolocation; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class GeometryLocationDto { + private double lat; + private double lng; +} \ No newline at end of file diff --git a/src/main/java/com/kusitms/jipbap/user/dto/geolocation/PlusCodeDto.java b/src/main/java/com/kusitms/jipbap/user/dto/geolocation/PlusCodeDto.java new file mode 100644 index 0000000..b8aa708 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/dto/geolocation/PlusCodeDto.java @@ -0,0 +1,11 @@ +package com.kusitms.jipbap.user.dto.geolocation; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class PlusCodeDto { + private String compoundCode; + private String globalCode; +} \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 238c179..7f5cbd5 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -53,4 +53,5 @@ cloud: secret: pwd: ${SECRET_PWD} - jwt: ${SECRET_JWT} \ No newline at end of file + jwt: ${SECRET_JWT} + geocodingApiKey: ${GEOCODING_API_KEY} \ No newline at end of file From 95754b70c7d2765da0e31bd579763b63ba6f2378 Mon Sep 17 00:00:00 2001 From: summit45 Date: Tue, 14 Nov 2023 12:50:09 +0900 Subject: [PATCH 04/10] =?UTF-8?q?feat:=20=EC=A3=BC=EC=86=8C=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20DB=20=EA=B5=AC=EC=A1=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/kusitms/jipbap/user/User.java | 10 ++++- .../user/entity/area/AdministrativeArea.java | 26 ++++++++++++ .../jipbap/user/entity/area/GlobalArea.java | 41 +++++++++++++++++++ .../jipbap/user/entity/area/LocalArea.java | 24 +++++++++++ .../user/repository/GlobalAreaRepository.java | 8 ++++ 5 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/kusitms/jipbap/user/entity/area/AdministrativeArea.java create mode 100644 src/main/java/com/kusitms/jipbap/user/entity/area/GlobalArea.java create mode 100644 src/main/java/com/kusitms/jipbap/user/entity/area/LocalArea.java create mode 100644 src/main/java/com/kusitms/jipbap/user/repository/GlobalAreaRepository.java diff --git a/src/main/java/com/kusitms/jipbap/user/User.java b/src/main/java/com/kusitms/jipbap/user/User.java index fcc8b6f..f3fb571 100644 --- a/src/main/java/com/kusitms/jipbap/user/User.java +++ b/src/main/java/com/kusitms/jipbap/user/User.java @@ -1,6 +1,7 @@ package com.kusitms.jipbap.user; import com.kusitms.jipbap.common.entity.DateEntity; +import com.kusitms.jipbap.user.entity.area.LocalArea; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; @@ -33,8 +34,15 @@ public class User extends DateEntity { @Column(unique = true) private String username; //닉네임 + @ManyToOne + @JoinColumn(name = "local_area_id") + private LocalArea localArea; //지역 + + @NotBlank + private String address; //상세주소 + @NotBlank - private String address; //주소 + private String postalCode; //우편번호 private String image; //프로필 사진 diff --git a/src/main/java/com/kusitms/jipbap/user/entity/area/AdministrativeArea.java b/src/main/java/com/kusitms/jipbap/user/entity/area/AdministrativeArea.java new file mode 100644 index 0000000..e572b4e --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/entity/area/AdministrativeArea.java @@ -0,0 +1,26 @@ +package com.kusitms.jipbap.user.entity.area; + +import jakarta.persistence.*; + +import java.util.List; + +@Entity +@Table(name = "tb_administrative_area") +public class AdministrativeArea { + @Id + @Column(name = "administrative_area_id") + private Long administrativeAreaId; + + @Column + private String name; + + @ManyToOne + @JoinColumn(name = "global_area_id") + private GlobalArea globalArea; + + @OneToMany(mappedBy= "administrativeArea") + private List localAreaList; + + public AdministrativeArea() { + } +} \ No newline at end of file diff --git a/src/main/java/com/kusitms/jipbap/user/entity/area/GlobalArea.java b/src/main/java/com/kusitms/jipbap/user/entity/area/GlobalArea.java new file mode 100644 index 0000000..252a313 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/entity/area/GlobalArea.java @@ -0,0 +1,41 @@ +package com.kusitms.jipbap.user.entity.area; + +import jakarta.persistence.*; +import lombok.*; + +import java.util.List; + +@Builder +@Entity +@Table(name = "tb_global_area") +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class GlobalArea { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Long Id; + + @Column(name = "country_long_name") + private String countryLongName; + + @Column(name = "country_short_name") + private String countryShortName; + + @Column(name = "country_korean") + private String CountryKorean; + + @Column(name="state_long_name") + private String stateLongName; + + @Column(name="state_short_name") + private String stateShortName; + + @Column(name="state_korean") + private String stateKorean; + + @OneToMany(mappedBy = "globalArea") + private List administrativeAreaList; +} diff --git a/src/main/java/com/kusitms/jipbap/user/entity/area/LocalArea.java b/src/main/java/com/kusitms/jipbap/user/entity/area/LocalArea.java new file mode 100644 index 0000000..3a8aab9 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/entity/area/LocalArea.java @@ -0,0 +1,24 @@ +package com.kusitms.jipbap.user.entity.area; + + +import jakarta.persistence.*; + + +@Entity +@Table(name = "tb_local_area") +public class LocalArea { + @Id + @Column(name = "local_area_id") + private Long localAreaId; + + @Column + private String name; + + @ManyToOne + @JoinColumn(name = "administrative_area_id") + private AdministrativeArea administrativeArea; + + public LocalArea() { + } + +} \ No newline at end of file diff --git a/src/main/java/com/kusitms/jipbap/user/repository/GlobalAreaRepository.java b/src/main/java/com/kusitms/jipbap/user/repository/GlobalAreaRepository.java new file mode 100644 index 0000000..33b26df --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/repository/GlobalAreaRepository.java @@ -0,0 +1,8 @@ +package com.kusitms.jipbap.user.repository; + +import com.kusitms.jipbap.store.StoreRepositoryExtension; +import com.kusitms.jipbap.user.entity.area.GlobalArea; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface GlobalAreaRepository extends JpaRepository, StoreRepositoryExtension { +} From ad404afa84d7bdd37199790f8c66588ff2eba090 Mon Sep 17 00:00:00 2001 From: summit45 Date: Tue, 14 Nov 2023 12:50:29 +0900 Subject: [PATCH 05/10] =?UTF-8?q?feat:=20=EA=B5=AD=EA=B0=80/=EC=A3=BC?= =?UTF-8?q?=EB=A6=BD=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=A0=80=EC=9E=A5=20?= =?UTF-8?q?API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jipbap/config/SpringSecurityConfig.java | 3 +- .../jipbap/user/AddressController.java | 31 +++++++++++++++++++ .../user/dto/address/GlobalAreaRequest.java | 27 ++++++++++++++++ .../user/dto/address/GlobalAreaResponse.java | 16 ++++++++++ 4 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/kusitms/jipbap/user/AddressController.java create mode 100644 src/main/java/com/kusitms/jipbap/user/dto/address/GlobalAreaRequest.java create mode 100644 src/main/java/com/kusitms/jipbap/user/dto/address/GlobalAreaResponse.java diff --git a/src/main/java/com/kusitms/jipbap/config/SpringSecurityConfig.java b/src/main/java/com/kusitms/jipbap/config/SpringSecurityConfig.java index d58d994..e265e98 100644 --- a/src/main/java/com/kusitms/jipbap/config/SpringSecurityConfig.java +++ b/src/main/java/com/kusitms/jipbap/config/SpringSecurityConfig.java @@ -65,7 +65,8 @@ public WebSecurityCustomizer webSecurityCustomizer() { "/error", "/auth/**", "/ws/**", //ws://localhost:8080/ws/chat - "/ws-stomp/**" + "/ws-stomp/**", + "/addresses/**" ); } } \ No newline at end of file diff --git a/src/main/java/com/kusitms/jipbap/user/AddressController.java b/src/main/java/com/kusitms/jipbap/user/AddressController.java new file mode 100644 index 0000000..4499c95 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/AddressController.java @@ -0,0 +1,31 @@ +package com.kusitms.jipbap.user; + +import com.kusitms.jipbap.common.response.CommonResponse; +import com.kusitms.jipbap.security.Auth; +import com.kusitms.jipbap.security.AuthInfo; +import com.kusitms.jipbap.user.dto.address.GlobalAreaRequest; +import com.kusitms.jipbap.user.dto.address.GlobalAreaResponse; +import com.kusitms.jipbap.user.entity.area.GlobalArea; +import com.kusitms.jipbap.user.repository.GlobalAreaRepository; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; + +@RequiredArgsConstructor +@RestController +@RequestMapping("/addresses") +public class AddressController { + + private final GlobalAreaRepository globalAreaRepository; + @Operation(summary = "국가/주립 코드 데이터 저장") + @PostMapping("/global-area") + public CommonResponse saveGloablAreaData (@Valid @RequestBody GlobalAreaRequest dto) { + GlobalArea globalArea = globalAreaRepository.save(dto.toEntity()); + return new CommonResponse<>(new GlobalAreaResponse(globalArea.getId(), globalArea.getCountryLongName(), globalArea.getStateLongName())); + } +} diff --git a/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalAreaRequest.java b/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalAreaRequest.java new file mode 100644 index 0000000..aeb2fbc --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalAreaRequest.java @@ -0,0 +1,27 @@ +package com.kusitms.jipbap.user.dto.address; + +import com.kusitms.jipbap.user.entity.area.GlobalArea; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class GlobalAreaRequest { + private String countryLongName; + private String countryShortName; + private String CountryKorean; + private String stateLongName; + private String stateShortName; + private String stateKorean; + + public GlobalArea toEntity() { + return GlobalArea.builder() + .countryLongName(countryLongName) + .countryShortName(countryShortName) + .CountryKorean(CountryKorean) + .stateLongName(stateLongName) + .stateShortName(stateShortName) + .stateKorean(stateKorean) + .build(); + } +} diff --git a/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalAreaResponse.java b/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalAreaResponse.java new file mode 100644 index 0000000..2cfc026 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalAreaResponse.java @@ -0,0 +1,16 @@ +package com.kusitms.jipbap.user.dto.address; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class GlobalAreaResponse { + private Long id; + private String countryLongName; + private String stateLongName; +} From aca47fc160db8c729e7079ae2f7f0dc13a48d25a Mon Sep 17 00:00:00 2001 From: summit45 Date: Tue, 14 Nov 2023 14:49:06 +0900 Subject: [PATCH 06/10] =?UTF-8?q?fix:=20=EC=A7=80=EC=97=AD=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=A0=80=EC=9E=A5=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jipbap/user/AddressController.java | 31 ------------------- .../java/com/kusitms/jipbap/user/User.java | 6 ++-- .../jipbap/user/UserAddressController.java | 30 ++++++++++++++++++ .../jipbap/user/UserAddressService.java | 15 +++++++++ .../user/dto/address/GlobalAreaRequest.java | 27 ---------------- .../user/dto/address/GlobalRegionRequest.java | 26 ++++++++++++++++ ...esponse.java => GlobalRegionResponse.java} | 6 ++-- .../GlobalArea.java => GlobalRegion.java} | 24 ++++++-------- .../user/entity/area/AdministrativeArea.java | 26 ---------------- .../jipbap/user/entity/area/LocalArea.java | 24 -------------- .../user/repository/GlobalAreaRepository.java | 8 ----- .../repository/GlobalRegionRepository.java | 7 +++++ 12 files changed, 94 insertions(+), 136 deletions(-) delete mode 100644 src/main/java/com/kusitms/jipbap/user/AddressController.java create mode 100644 src/main/java/com/kusitms/jipbap/user/UserAddressController.java delete mode 100644 src/main/java/com/kusitms/jipbap/user/dto/address/GlobalAreaRequest.java create mode 100644 src/main/java/com/kusitms/jipbap/user/dto/address/GlobalRegionRequest.java rename src/main/java/com/kusitms/jipbap/user/dto/address/{GlobalAreaResponse.java => GlobalRegionResponse.java} (69%) rename src/main/java/com/kusitms/jipbap/user/entity/{area/GlobalArea.java => GlobalRegion.java} (50%) delete mode 100644 src/main/java/com/kusitms/jipbap/user/entity/area/AdministrativeArea.java delete mode 100644 src/main/java/com/kusitms/jipbap/user/entity/area/LocalArea.java delete mode 100644 src/main/java/com/kusitms/jipbap/user/repository/GlobalAreaRepository.java create mode 100644 src/main/java/com/kusitms/jipbap/user/repository/GlobalRegionRepository.java diff --git a/src/main/java/com/kusitms/jipbap/user/AddressController.java b/src/main/java/com/kusitms/jipbap/user/AddressController.java deleted file mode 100644 index 4499c95..0000000 --- a/src/main/java/com/kusitms/jipbap/user/AddressController.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.kusitms.jipbap.user; - -import com.kusitms.jipbap.common.response.CommonResponse; -import com.kusitms.jipbap.security.Auth; -import com.kusitms.jipbap.security.AuthInfo; -import com.kusitms.jipbap.user.dto.address.GlobalAreaRequest; -import com.kusitms.jipbap.user.dto.address.GlobalAreaResponse; -import com.kusitms.jipbap.user.entity.area.GlobalArea; -import com.kusitms.jipbap.user.repository.GlobalAreaRepository; -import io.swagger.v3.oas.annotations.Operation; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.validation.Valid; - -@RequiredArgsConstructor -@RestController -@RequestMapping("/addresses") -public class AddressController { - - private final GlobalAreaRepository globalAreaRepository; - @Operation(summary = "국가/주립 코드 데이터 저장") - @PostMapping("/global-area") - public CommonResponse saveGloablAreaData (@Valid @RequestBody GlobalAreaRequest dto) { - GlobalArea globalArea = globalAreaRepository.save(dto.toEntity()); - return new CommonResponse<>(new GlobalAreaResponse(globalArea.getId(), globalArea.getCountryLongName(), globalArea.getStateLongName())); - } -} diff --git a/src/main/java/com/kusitms/jipbap/user/User.java b/src/main/java/com/kusitms/jipbap/user/User.java index f3fb571..7ac2002 100644 --- a/src/main/java/com/kusitms/jipbap/user/User.java +++ b/src/main/java/com/kusitms/jipbap/user/User.java @@ -1,7 +1,7 @@ package com.kusitms.jipbap.user; import com.kusitms.jipbap.common.entity.DateEntity; -import com.kusitms.jipbap.user.entity.area.LocalArea; +import com.kusitms.jipbap.user.entity.GlobalRegion; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; @@ -35,8 +35,8 @@ public class User extends DateEntity { private String username; //닉네임 @ManyToOne - @JoinColumn(name = "local_area_id") - private LocalArea localArea; //지역 + @JoinColumn(name = "global_region_id") + private GlobalRegion globalRegion; //지역 @NotBlank private String address; //상세주소 diff --git a/src/main/java/com/kusitms/jipbap/user/UserAddressController.java b/src/main/java/com/kusitms/jipbap/user/UserAddressController.java new file mode 100644 index 0000000..425834e --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/UserAddressController.java @@ -0,0 +1,30 @@ +package com.kusitms.jipbap.user; + +import com.kusitms.jipbap.common.response.CommonResponse; +import com.kusitms.jipbap.user.dto.address.GlobalRegionRequest; +import com.kusitms.jipbap.user.dto.address.GlobalRegionResponse; +import com.kusitms.jipbap.user.entity.GlobalRegion; +import com.kusitms.jipbap.user.repository.GlobalRegionRepository; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; + +@RequiredArgsConstructor +@RestController +@RequestMapping("/addresses") +public class UserAddressController { + + private final UserAddressService userAddressService; + + @Operation(summary = "지역 코드 데이터 저장하기") + @PostMapping("/global-area") + public CommonResponse saveGlobalAreaData (@Valid @RequestBody GlobalRegionRequest dto) { + return new CommonResponse<>(userAddressService.saveGlobalAreaData(dto)); + } + +} diff --git a/src/main/java/com/kusitms/jipbap/user/UserAddressService.java b/src/main/java/com/kusitms/jipbap/user/UserAddressService.java index 7ebb890..6e0e6d9 100644 --- a/src/main/java/com/kusitms/jipbap/user/UserAddressService.java +++ b/src/main/java/com/kusitms/jipbap/user/UserAddressService.java @@ -1,27 +1,42 @@ package com.kusitms.jipbap.user; +import com.kusitms.jipbap.common.response.CommonResponse; +import com.kusitms.jipbap.user.dto.address.GlobalRegionRequest; +import com.kusitms.jipbap.user.dto.address.GlobalRegionResponse; import com.kusitms.jipbap.user.dto.geolocation.AddressComponentDto; import com.kusitms.jipbap.user.dto.geolocation.GeocodingAddressDto; import com.kusitms.jipbap.user.dto.geolocation.GeocodingResponseDto; +import com.kusitms.jipbap.user.entity.GlobalRegion; import com.kusitms.jipbap.user.exception.GeocodingConnectionException; import com.kusitms.jipbap.user.exception.GeocodingUnknownAdressException; +import com.kusitms.jipbap.user.repository.GlobalRegionRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.client.RestTemplate; +import javax.validation.Valid; import java.util.List; @Slf4j @Service @RequiredArgsConstructor public class UserAddressService { + + private final GlobalRegionRepository globalRegionRepository; + @Value("${secret.geocodingApiKey}") private String apiKey; + public GlobalRegionResponse saveGlobalAreaData (GlobalRegionRequest dto) { + GlobalRegion globalRegion = globalRegionRepository.save(dto.toEntity()); + return new GlobalRegionResponse(globalRegion.getId(), globalRegion.getCountryShortName(), globalRegion.getRegionName()); + } + @Transactional public void getGeoDataByAddress(String address){ JSONObject geocodingData = getGeocodingData(address); diff --git a/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalAreaRequest.java b/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalAreaRequest.java deleted file mode 100644 index aeb2fbc..0000000 --- a/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalAreaRequest.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.kusitms.jipbap.user.dto.address; - -import com.kusitms.jipbap.user.entity.area.GlobalArea; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class GlobalAreaRequest { - private String countryLongName; - private String countryShortName; - private String CountryKorean; - private String stateLongName; - private String stateShortName; - private String stateKorean; - - public GlobalArea toEntity() { - return GlobalArea.builder() - .countryLongName(countryLongName) - .countryShortName(countryShortName) - .CountryKorean(CountryKorean) - .stateLongName(stateLongName) - .stateShortName(stateShortName) - .stateKorean(stateKorean) - .build(); - } -} diff --git a/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalRegionRequest.java b/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalRegionRequest.java new file mode 100644 index 0000000..33926c8 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalRegionRequest.java @@ -0,0 +1,26 @@ +package com.kusitms.jipbap.user.dto.address; + +import com.kusitms.jipbap.user.entity.GlobalRegion; +import jakarta.persistence.Column; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class GlobalRegionRequest { + private String countryLongName; + private String countryShortName; + private String countryKorean; + private String regionName; + private String regionKorean; + + public GlobalRegion toEntity() { + return GlobalRegion.builder() + .countryLongName(countryLongName) + .countryShortName(countryShortName) + .countryKorean(countryKorean) + .regionName(regionName) + .regionKorean(regionKorean) + .build(); + } +} diff --git a/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalAreaResponse.java b/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalRegionResponse.java similarity index 69% rename from src/main/java/com/kusitms/jipbap/user/dto/address/GlobalAreaResponse.java rename to src/main/java/com/kusitms/jipbap/user/dto/address/GlobalRegionResponse.java index 2cfc026..8840e38 100644 --- a/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalAreaResponse.java +++ b/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalRegionResponse.java @@ -9,8 +9,8 @@ @Setter @NoArgsConstructor @AllArgsConstructor -public class GlobalAreaResponse { +public class GlobalRegionResponse { private Long id; - private String countryLongName; - private String stateLongName; + private String countryShortName; + private String regionName; } diff --git a/src/main/java/com/kusitms/jipbap/user/entity/area/GlobalArea.java b/src/main/java/com/kusitms/jipbap/user/entity/GlobalRegion.java similarity index 50% rename from src/main/java/com/kusitms/jipbap/user/entity/area/GlobalArea.java rename to src/main/java/com/kusitms/jipbap/user/entity/GlobalRegion.java index 252a313..ae09c92 100644 --- a/src/main/java/com/kusitms/jipbap/user/entity/area/GlobalArea.java +++ b/src/main/java/com/kusitms/jipbap/user/entity/GlobalRegion.java @@ -1,5 +1,6 @@ -package com.kusitms.jipbap.user.entity.area; +package com.kusitms.jipbap.user.entity; +import com.kusitms.jipbap.user.entity.area.AdministrativeArea; import jakarta.persistence.*; import lombok.*; @@ -7,12 +8,13 @@ @Builder @Entity -@Table(name = "tb_global_area") +@Table(name = "tb_global_region") @Getter @Setter @AllArgsConstructor @NoArgsConstructor -public class GlobalArea { +public class GlobalRegion { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") @@ -25,17 +27,11 @@ public class GlobalArea { private String countryShortName; @Column(name = "country_korean") - private String CountryKorean; - - @Column(name="state_long_name") - private String stateLongName; - - @Column(name="state_short_name") - private String stateShortName; + private String countryKorean; - @Column(name="state_korean") - private String stateKorean; + @Column(name="region_name") + private String regionName; - @OneToMany(mappedBy = "globalArea") - private List administrativeAreaList; + @Column(name="region_korean") + private String regionKorean; } diff --git a/src/main/java/com/kusitms/jipbap/user/entity/area/AdministrativeArea.java b/src/main/java/com/kusitms/jipbap/user/entity/area/AdministrativeArea.java deleted file mode 100644 index e572b4e..0000000 --- a/src/main/java/com/kusitms/jipbap/user/entity/area/AdministrativeArea.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.kusitms.jipbap.user.entity.area; - -import jakarta.persistence.*; - -import java.util.List; - -@Entity -@Table(name = "tb_administrative_area") -public class AdministrativeArea { - @Id - @Column(name = "administrative_area_id") - private Long administrativeAreaId; - - @Column - private String name; - - @ManyToOne - @JoinColumn(name = "global_area_id") - private GlobalArea globalArea; - - @OneToMany(mappedBy= "administrativeArea") - private List localAreaList; - - public AdministrativeArea() { - } -} \ No newline at end of file diff --git a/src/main/java/com/kusitms/jipbap/user/entity/area/LocalArea.java b/src/main/java/com/kusitms/jipbap/user/entity/area/LocalArea.java deleted file mode 100644 index 3a8aab9..0000000 --- a/src/main/java/com/kusitms/jipbap/user/entity/area/LocalArea.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.kusitms.jipbap.user.entity.area; - - -import jakarta.persistence.*; - - -@Entity -@Table(name = "tb_local_area") -public class LocalArea { - @Id - @Column(name = "local_area_id") - private Long localAreaId; - - @Column - private String name; - - @ManyToOne - @JoinColumn(name = "administrative_area_id") - private AdministrativeArea administrativeArea; - - public LocalArea() { - } - -} \ No newline at end of file diff --git a/src/main/java/com/kusitms/jipbap/user/repository/GlobalAreaRepository.java b/src/main/java/com/kusitms/jipbap/user/repository/GlobalAreaRepository.java deleted file mode 100644 index 33b26df..0000000 --- a/src/main/java/com/kusitms/jipbap/user/repository/GlobalAreaRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.kusitms.jipbap.user.repository; - -import com.kusitms.jipbap.store.StoreRepositoryExtension; -import com.kusitms.jipbap.user.entity.area.GlobalArea; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface GlobalAreaRepository extends JpaRepository, StoreRepositoryExtension { -} diff --git a/src/main/java/com/kusitms/jipbap/user/repository/GlobalRegionRepository.java b/src/main/java/com/kusitms/jipbap/user/repository/GlobalRegionRepository.java new file mode 100644 index 0000000..b9ceebc --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/repository/GlobalRegionRepository.java @@ -0,0 +1,7 @@ +package com.kusitms.jipbap.user.repository; + +import com.kusitms.jipbap.user.entity.GlobalRegion; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface GlobalRegionRepository extends JpaRepository { +} From 4dc95a38b6be1fd36db22c3263829ae511d3f061 Mon Sep 17 00:00:00 2001 From: summit45 Date: Tue, 14 Nov 2023 15:19:48 +0900 Subject: [PATCH 07/10] =?UTF-8?q?feat:=20=EB=AA=A8=EB=93=A0=20=EC=A7=80?= =?UTF-8?q?=EC=97=AD=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=ED=95=98=EB=8A=94=20api=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jipbap/common/response/ErrorCode.java | 3 +++ .../jipbap/user/UserAddressController.java | 16 +++++++++---- .../user/UserAddressExceptionController.java | 23 +++++++++++++++++++ .../jipbap/user/UserAddressService.java | 18 ++++++++++++++- .../user/dto/address/GlobalRegionRequest.java | 10 ++++++++ .../dto/address/GlobalRegionResponse.java | 14 +++++++++++ .../user/exception/RegionExistsException.java | 7 ++++++ .../repository/GlobalRegionRepository.java | 1 + 8 files changed, 86 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/kusitms/jipbap/user/UserAddressExceptionController.java create mode 100644 src/main/java/com/kusitms/jipbap/user/exception/RegionExistsException.java diff --git a/src/main/java/com/kusitms/jipbap/common/response/ErrorCode.java b/src/main/java/com/kusitms/jipbap/common/response/ErrorCode.java index 813c9ea..5f06bac 100644 --- a/src/main/java/com/kusitms/jipbap/common/response/ErrorCode.java +++ b/src/main/java/com/kusitms/jipbap/common/response/ErrorCode.java @@ -34,6 +34,9 @@ public enum ErrorCode { //food CATEGORY_NOT_FOUND_ERROR(false, HttpStatus.BAD_REQUEST.value(), "존재하지 않는 카테고리입니다."), FOOD_NOT_FOUND_ERROR(false, HttpStatus.BAD_REQUEST.value(), "존재하지 않는 메뉴입니다."), + + //address + REGION_ALREADY_EXISTS_ERROR(false, HttpStatus.BAD_REQUEST.value(), "이미 존재하는 지역입니다."), ; private Boolean isSuccess; diff --git a/src/main/java/com/kusitms/jipbap/user/UserAddressController.java b/src/main/java/com/kusitms/jipbap/user/UserAddressController.java index 425834e..e8215a6 100644 --- a/src/main/java/com/kusitms/jipbap/user/UserAddressController.java +++ b/src/main/java/com/kusitms/jipbap/user/UserAddressController.java @@ -7,12 +7,11 @@ import com.kusitms.jipbap.user.repository.GlobalRegionRepository; import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; import javax.validation.Valid; +import java.util.List; @RequiredArgsConstructor @RestController @@ -23,8 +22,15 @@ public class UserAddressController { @Operation(summary = "지역 코드 데이터 저장하기") @PostMapping("/global-area") + @ResponseStatus(HttpStatus.CREATED) public CommonResponse saveGlobalAreaData (@Valid @RequestBody GlobalRegionRequest dto) { return new CommonResponse<>(userAddressService.saveGlobalAreaData(dto)); } - + + @Operation(summary = "모든 지역 코드 데이터 조회하기") + @GetMapping("/global-area") + @ResponseStatus(HttpStatus.OK) + public CommonResponse> getAllGlobalAreaData () { + return new CommonResponse<>(userAddressService.getAllGlobalAreaData()); + } } diff --git a/src/main/java/com/kusitms/jipbap/user/UserAddressExceptionController.java b/src/main/java/com/kusitms/jipbap/user/UserAddressExceptionController.java new file mode 100644 index 0000000..93f1c77 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/UserAddressExceptionController.java @@ -0,0 +1,23 @@ +package com.kusitms.jipbap.user; + +import com.kusitms.jipbap.common.response.CommonResponse; +import com.kusitms.jipbap.common.response.ErrorCode; +import com.kusitms.jipbap.user.exception.RegionExistsException; +import com.kusitms.jipbap.user.exception.UserNotFoundException; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@Slf4j +@RestControllerAdvice +public class UserAddressExceptionController { + @ExceptionHandler(RegionExistsException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public CommonResponse RegionExistsException(RegionExistsException e, HttpServletRequest request) { + log.warn("UserAddress-001> 요청 URI: " + request.getRequestURI() + ", 에러 메세지: " + e.getMessage()); + return new CommonResponse<>(ErrorCode.REGION_ALREADY_EXISTS_ERROR); + } +} diff --git a/src/main/java/com/kusitms/jipbap/user/UserAddressService.java b/src/main/java/com/kusitms/jipbap/user/UserAddressService.java index 6e0e6d9..7877d4d 100644 --- a/src/main/java/com/kusitms/jipbap/user/UserAddressService.java +++ b/src/main/java/com/kusitms/jipbap/user/UserAddressService.java @@ -1,5 +1,6 @@ package com.kusitms.jipbap.user; +import com.kusitms.jipbap.auth.exception.EmailExistsException; import com.kusitms.jipbap.common.response.CommonResponse; import com.kusitms.jipbap.user.dto.address.GlobalRegionRequest; import com.kusitms.jipbap.user.dto.address.GlobalRegionResponse; @@ -9,6 +10,7 @@ import com.kusitms.jipbap.user.entity.GlobalRegion; import com.kusitms.jipbap.user.exception.GeocodingConnectionException; import com.kusitms.jipbap.user.exception.GeocodingUnknownAdressException; +import com.kusitms.jipbap.user.exception.RegionExistsException; import com.kusitms.jipbap.user.repository.GlobalRegionRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -21,6 +23,8 @@ import javax.validation.Valid; import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; @Slf4j @Service @@ -33,8 +37,20 @@ public class UserAddressService { private String apiKey; public GlobalRegionResponse saveGlobalAreaData (GlobalRegionRequest dto) { + if(globalRegionRepository.existsByRegionName(dto.getRegionName())) throw new RegionExistsException("이미 존재하는 지역입니다."); + GlobalRegion globalRegion = globalRegionRepository.save(dto.toEntity()); - return new GlobalRegionResponse(globalRegion.getId(), globalRegion.getCountryShortName(), globalRegion.getRegionName()); + return new GlobalRegionResponse(globalRegion); + } + + public List getAllGlobalAreaData () { + List globalRegionList = globalRegionRepository.findAll(); + + List globalRegionResponse = globalRegionList.stream() + .map(GlobalRegionResponse::new) + .collect(Collectors.toList()); + + return globalRegionResponse; } @Transactional diff --git a/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalRegionRequest.java b/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalRegionRequest.java index 33926c8..fe3f5ea 100644 --- a/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalRegionRequest.java +++ b/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalRegionRequest.java @@ -1,6 +1,7 @@ package com.kusitms.jipbap.user.dto.address; import com.kusitms.jipbap.user.entity.GlobalRegion; +import io.swagger.v3.oas.annotations.media.Schema; import jakarta.persistence.Column; import lombok.Getter; import lombok.Setter; @@ -8,10 +9,19 @@ @Getter @Setter public class GlobalRegionRequest { + @Schema(description = "국가명(영문)", example = "United States") private String countryLongName; + + @Schema(description = "축약 국가명(영문)", example = "US") private String countryShortName; + + @Schema(description = "국가명(한글)", example = "미국") private String countryKorean; + + @Schema(description = "지역명(영문)", example = "New York") private String regionName; + + @Schema(description = "지역명(한글)", example = "뉴욕") private String regionKorean; public GlobalRegion toEntity() { diff --git a/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalRegionResponse.java b/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalRegionResponse.java index 8840e38..b1c40b9 100644 --- a/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalRegionResponse.java +++ b/src/main/java/com/kusitms/jipbap/user/dto/address/GlobalRegionResponse.java @@ -1,10 +1,14 @@ package com.kusitms.jipbap.user.dto.address; +import com.kusitms.jipbap.user.entity.GlobalRegion; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import java.util.List; +import java.util.stream.Collectors; + @Getter @Setter @NoArgsConstructor @@ -12,5 +16,15 @@ public class GlobalRegionResponse { private Long id; private String countryShortName; + private String countryKorean; private String regionName; + private String regionKorean; + + public GlobalRegionResponse(GlobalRegion globalRegion) { + this.id = globalRegion.getId(); + this.countryShortName = globalRegion.getCountryShortName(); + this.countryKorean = globalRegion.getCountryKorean(); + this.regionName = globalRegion.getRegionName(); + this.regionKorean = globalRegion.getRegionKorean(); + } } diff --git a/src/main/java/com/kusitms/jipbap/user/exception/RegionExistsException.java b/src/main/java/com/kusitms/jipbap/user/exception/RegionExistsException.java new file mode 100644 index 0000000..8209be5 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/exception/RegionExistsException.java @@ -0,0 +1,7 @@ +package com.kusitms.jipbap.user.exception; + +public class RegionExistsException extends RuntimeException{ + public RegionExistsException(String message) { + super(message); + } +} diff --git a/src/main/java/com/kusitms/jipbap/user/repository/GlobalRegionRepository.java b/src/main/java/com/kusitms/jipbap/user/repository/GlobalRegionRepository.java index b9ceebc..708e2d4 100644 --- a/src/main/java/com/kusitms/jipbap/user/repository/GlobalRegionRepository.java +++ b/src/main/java/com/kusitms/jipbap/user/repository/GlobalRegionRepository.java @@ -4,4 +4,5 @@ import org.springframework.data.jpa.repository.JpaRepository; public interface GlobalRegionRepository extends JpaRepository { + boolean existsByRegionName(String regionName); } From 39e232ff8f685ce4177e654c26bd27bf688495b5 Mon Sep 17 00:00:00 2001 From: summit45 Date: Tue, 14 Nov 2023 15:50:17 +0900 Subject: [PATCH 08/10] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=20=EC=A3=BC?= =?UTF-8?q?=EC=86=8C=20=EC=84=A4=EC=A0=95=20api=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jipbap/common/response/ErrorCode.java | 1 + .../java/com/kusitms/jipbap/user/User.java | 5 ++- .../jipbap/user/UserAddressController.java | 14 ++++++-- .../user/UserAddressExceptionController.java | 9 ++++- .../jipbap/user/UserAddressService.java | 35 +++++++++++++------ .../user/dto/address/UserAddressRequest.java | 18 ++++++++++ .../user/dto/address/UserAddressResponse.java | 35 +++++++++++++++++++ .../user/exception/RegionExistsException.java | 2 +- .../exception/RegionNotFoundException.java | 7 ++++ 9 files changed, 111 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/kusitms/jipbap/user/dto/address/UserAddressRequest.java create mode 100644 src/main/java/com/kusitms/jipbap/user/dto/address/UserAddressResponse.java create mode 100644 src/main/java/com/kusitms/jipbap/user/exception/RegionNotFoundException.java diff --git a/src/main/java/com/kusitms/jipbap/common/response/ErrorCode.java b/src/main/java/com/kusitms/jipbap/common/response/ErrorCode.java index 5f06bac..37a7ce5 100644 --- a/src/main/java/com/kusitms/jipbap/common/response/ErrorCode.java +++ b/src/main/java/com/kusitms/jipbap/common/response/ErrorCode.java @@ -37,6 +37,7 @@ public enum ErrorCode { //address REGION_ALREADY_EXISTS_ERROR(false, HttpStatus.BAD_REQUEST.value(), "이미 존재하는 지역입니다."), + REGION_NOT_FOUND_ERROR(false, HttpStatus.BAD_REQUEST.value(), "존재하지 않는 지역입니다."), ; private Boolean isSuccess; diff --git a/src/main/java/com/kusitms/jipbap/user/User.java b/src/main/java/com/kusitms/jipbap/user/User.java index 7ac2002..c216e0b 100644 --- a/src/main/java/com/kusitms/jipbap/user/User.java +++ b/src/main/java/com/kusitms/jipbap/user/User.java @@ -39,7 +39,10 @@ public class User extends DateEntity { private GlobalRegion globalRegion; //지역 @NotBlank - private String address; //상세주소 + private String address; //주소 + + @NotBlank + private String detailAddress; //상세주소 @NotBlank private String postalCode; //우편번호 diff --git a/src/main/java/com/kusitms/jipbap/user/UserAddressController.java b/src/main/java/com/kusitms/jipbap/user/UserAddressController.java index e8215a6..04c5342 100644 --- a/src/main/java/com/kusitms/jipbap/user/UserAddressController.java +++ b/src/main/java/com/kusitms/jipbap/user/UserAddressController.java @@ -3,6 +3,8 @@ import com.kusitms.jipbap.common.response.CommonResponse; import com.kusitms.jipbap.user.dto.address.GlobalRegionRequest; import com.kusitms.jipbap.user.dto.address.GlobalRegionResponse; +import com.kusitms.jipbap.user.dto.address.UserAddressRequest; +import com.kusitms.jipbap.user.dto.address.UserAddressResponse; import com.kusitms.jipbap.user.entity.GlobalRegion; import com.kusitms.jipbap.user.repository.GlobalRegionRepository; import io.swagger.v3.oas.annotations.Operation; @@ -20,17 +22,25 @@ public class UserAddressController { private final UserAddressService userAddressService; + @Operation(summary = "사용자 주소 설정") + @PostMapping("") + @ResponseStatus(HttpStatus.CREATED) + public CommonResponse saveUserAddress(@Valid @RequestBody UserAddressRequest dto) { + return new CommonResponse<>(userAddressService.saveUserAddress(dto)); + } + @Operation(summary = "지역 코드 데이터 저장하기") @PostMapping("/global-area") @ResponseStatus(HttpStatus.CREATED) - public CommonResponse saveGlobalAreaData (@Valid @RequestBody GlobalRegionRequest dto) { + public CommonResponse saveGlobalAreaData(@Valid @RequestBody GlobalRegionRequest dto) { return new CommonResponse<>(userAddressService.saveGlobalAreaData(dto)); } @Operation(summary = "모든 지역 코드 데이터 조회하기") @GetMapping("/global-area") @ResponseStatus(HttpStatus.OK) - public CommonResponse> getAllGlobalAreaData () { + public CommonResponse> getAllGlobalAreaData() { return new CommonResponse<>(userAddressService.getAllGlobalAreaData()); } + } diff --git a/src/main/java/com/kusitms/jipbap/user/UserAddressExceptionController.java b/src/main/java/com/kusitms/jipbap/user/UserAddressExceptionController.java index 93f1c77..6c88579 100644 --- a/src/main/java/com/kusitms/jipbap/user/UserAddressExceptionController.java +++ b/src/main/java/com/kusitms/jipbap/user/UserAddressExceptionController.java @@ -2,8 +2,8 @@ import com.kusitms.jipbap.common.response.CommonResponse; import com.kusitms.jipbap.common.response.ErrorCode; +import com.kusitms.jipbap.user.exception.RegionNotFoundException; import com.kusitms.jipbap.user.exception.RegionExistsException; -import com.kusitms.jipbap.user.exception.UserNotFoundException; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; @@ -20,4 +20,11 @@ public CommonResponse RegionExistsException(RegionExistsException e, HttpServ log.warn("UserAddress-001> 요청 URI: " + request.getRequestURI() + ", 에러 메세지: " + e.getMessage()); return new CommonResponse<>(ErrorCode.REGION_ALREADY_EXISTS_ERROR); } + + @ExceptionHandler(RegionNotFoundException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public CommonResponse RegionNotFoundException(RegionNotFoundException e, HttpServletRequest request) { + log.warn("UserAddress-002> 요청 URI: " + request.getRequestURI() + ", 에러 메세지: " + e.getMessage()); + return new CommonResponse<>(ErrorCode.REGION_NOT_FOUND_ERROR); + } } diff --git a/src/main/java/com/kusitms/jipbap/user/UserAddressService.java b/src/main/java/com/kusitms/jipbap/user/UserAddressService.java index 7877d4d..a3d978b 100644 --- a/src/main/java/com/kusitms/jipbap/user/UserAddressService.java +++ b/src/main/java/com/kusitms/jipbap/user/UserAddressService.java @@ -1,16 +1,14 @@ package com.kusitms.jipbap.user; -import com.kusitms.jipbap.auth.exception.EmailExistsException; -import com.kusitms.jipbap.common.response.CommonResponse; import com.kusitms.jipbap.user.dto.address.GlobalRegionRequest; import com.kusitms.jipbap.user.dto.address.GlobalRegionResponse; +import com.kusitms.jipbap.user.dto.address.UserAddressRequest; +import com.kusitms.jipbap.user.dto.address.UserAddressResponse; import com.kusitms.jipbap.user.dto.geolocation.AddressComponentDto; import com.kusitms.jipbap.user.dto.geolocation.GeocodingAddressDto; import com.kusitms.jipbap.user.dto.geolocation.GeocodingResponseDto; import com.kusitms.jipbap.user.entity.GlobalRegion; -import com.kusitms.jipbap.user.exception.GeocodingConnectionException; -import com.kusitms.jipbap.user.exception.GeocodingUnknownAdressException; -import com.kusitms.jipbap.user.exception.RegionExistsException; +import com.kusitms.jipbap.user.exception.*; import com.kusitms.jipbap.user.repository.GlobalRegionRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -18,12 +16,9 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.client.RestTemplate; -import javax.validation.Valid; import java.util.List; -import java.util.Optional; import java.util.stream.Collectors; @Slf4j @@ -32,18 +27,31 @@ public class UserAddressService { private final GlobalRegionRepository globalRegionRepository; + private final UserRepository userRepository; @Value("${secret.geocodingApiKey}") private String apiKey; - public GlobalRegionResponse saveGlobalAreaData (GlobalRegionRequest dto) { + @Transactional + public UserAddressResponse saveUserAddress(UserAddressRequest dto) { + User user = userRepository.findById(dto.getUserId()) + .orElseThrow(()-> new UserNotFoundException("유저 정보가 존재하지 않습니다.")); + GlobalRegion globalRegion = globalRegionRepository.findById(dto.getGlobalRegionId()) + .orElseThrow(() -> new RegionNotFoundException("지역 정보가 존재하지 않습니다.")); + + setUserData(user, globalRegion, dto); + + return new UserAddressResponse(user); + } + + public GlobalRegionResponse saveGlobalAreaData(GlobalRegionRequest dto) { if(globalRegionRepository.existsByRegionName(dto.getRegionName())) throw new RegionExistsException("이미 존재하는 지역입니다."); GlobalRegion globalRegion = globalRegionRepository.save(dto.toEntity()); return new GlobalRegionResponse(globalRegion); } - public List getAllGlobalAreaData () { + public List getAllGlobalAreaData() { List globalRegionList = globalRegionRepository.findAll(); List globalRegionResponse = globalRegionList.stream() @@ -91,6 +99,13 @@ private JSONObject getGeocodingData(String address) { } } + private void setUserData(User user, GlobalRegion globalRegion, UserAddressRequest dto) { + user.setGlobalRegion(globalRegion); + user.setAddress(dto.getAddress()); + user.setDetailAddress(dto.getDetailAddress()); + user.setPostalCode(dto.getPostalCode()); + } + private void saveUserAddress(GeocodingAddressDto geocodingAddressDto) { try { String formattedAddress = geocodingAddressDto.getFormattedAddress(); // 실제 데이터베이스에 저장할 주소 diff --git a/src/main/java/com/kusitms/jipbap/user/dto/address/UserAddressRequest.java b/src/main/java/com/kusitms/jipbap/user/dto/address/UserAddressRequest.java new file mode 100644 index 0000000..77692bb --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/dto/address/UserAddressRequest.java @@ -0,0 +1,18 @@ +package com.kusitms.jipbap.user.dto.address; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class UserAddressRequest { + Long userId; + Long globalRegionId; + String address; + String detailAddress; + String postalCode; +} diff --git a/src/main/java/com/kusitms/jipbap/user/dto/address/UserAddressResponse.java b/src/main/java/com/kusitms/jipbap/user/dto/address/UserAddressResponse.java new file mode 100644 index 0000000..a72fde1 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/dto/address/UserAddressResponse.java @@ -0,0 +1,35 @@ +package com.kusitms.jipbap.user.dto.address; + +import com.kusitms.jipbap.user.User; +import com.kusitms.jipbap.user.entity.GlobalRegion; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class UserAddressResponse { + private Long userId; + private String email; + private String username; + private GlobalRegion globalRegion; + private String address; + private String detailAddress; + private String postalCode; + private String refreshToken; + + public UserAddressResponse(User user) { + this.userId = user.getId(); + this.email = user.getEmail(); + this.username = user.getUsername(); + this.globalRegion = user.getGlobalRegion(); + this.address = user.getAddress(); + this.detailAddress = user.getDetailAddress(); + this.postalCode = user.getPostalCode(); + this.refreshToken = user.getRefreshToken(); + } +} diff --git a/src/main/java/com/kusitms/jipbap/user/exception/RegionExistsException.java b/src/main/java/com/kusitms/jipbap/user/exception/RegionExistsException.java index 8209be5..752de2a 100644 --- a/src/main/java/com/kusitms/jipbap/user/exception/RegionExistsException.java +++ b/src/main/java/com/kusitms/jipbap/user/exception/RegionExistsException.java @@ -1,6 +1,6 @@ package com.kusitms.jipbap.user.exception; -public class RegionExistsException extends RuntimeException{ +public class RegionExistsException extends RuntimeException { public RegionExistsException(String message) { super(message); } diff --git a/src/main/java/com/kusitms/jipbap/user/exception/RegionNotFoundException.java b/src/main/java/com/kusitms/jipbap/user/exception/RegionNotFoundException.java new file mode 100644 index 0000000..a71acc1 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/exception/RegionNotFoundException.java @@ -0,0 +1,7 @@ +package com.kusitms.jipbap.user.exception; + +public class RegionNotFoundException extends RuntimeException { + public RegionNotFoundException(String message) { + super(message); + } +} From 804b14cd1ddd35e60d8db365b349282630e69bae Mon Sep 17 00:00:00 2001 From: summit45 Date: Tue, 14 Nov 2023 18:13:56 +0900 Subject: [PATCH 09/10] =?UTF-8?q?feat:=20=EC=9C=A0=ED=9A=A8=ED=95=9C=20?= =?UTF-8?q?=EC=A3=BC=EC=86=8C=EC=9D=B8=EC=A7=80=20=ED=99=95=EC=9D=B8?= =?UTF-8?q?=ED=95=98=EA=B3=A0=20=EC=9A=B0=ED=8E=B8=EB=B2=88=ED=98=B8=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20api=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jipbap/common/response/ErrorCode.java | 4 ++ .../jipbap/user/UserAddressController.java | 12 ++-- .../user/UserAddressExceptionController.java | 31 +++++++++- .../jipbap/user/UserAddressService.java | 59 +++++++++---------- .../user/dto/address/PostalAddressDto.java | 15 +++++ .../GeocodingConnectionException.java | 7 +++ .../GeocodingInvalidRequestException.java | 7 +++ .../GeocodingQueryMissingException.java | 7 +++ .../GeocodingUnknownAddressException.java | 7 +++ 9 files changed, 112 insertions(+), 37 deletions(-) create mode 100644 src/main/java/com/kusitms/jipbap/user/dto/address/PostalAddressDto.java create mode 100644 src/main/java/com/kusitms/jipbap/user/exception/GeocodingConnectionException.java create mode 100644 src/main/java/com/kusitms/jipbap/user/exception/GeocodingInvalidRequestException.java create mode 100644 src/main/java/com/kusitms/jipbap/user/exception/GeocodingQueryMissingException.java create mode 100644 src/main/java/com/kusitms/jipbap/user/exception/GeocodingUnknownAddressException.java diff --git a/src/main/java/com/kusitms/jipbap/common/response/ErrorCode.java b/src/main/java/com/kusitms/jipbap/common/response/ErrorCode.java index 37a7ce5..5db1b03 100644 --- a/src/main/java/com/kusitms/jipbap/common/response/ErrorCode.java +++ b/src/main/java/com/kusitms/jipbap/common/response/ErrorCode.java @@ -38,6 +38,10 @@ public enum ErrorCode { //address REGION_ALREADY_EXISTS_ERROR(false, HttpStatus.BAD_REQUEST.value(), "이미 존재하는 지역입니다."), REGION_NOT_FOUND_ERROR(false, HttpStatus.BAD_REQUEST.value(), "존재하지 않는 지역입니다."), + GEOCODING_CONNECTION_ERROR(false, HttpStatus.BAD_REQUEST.value(), "지오코딩 서버와 연결할 수 없습니다."), + GEOCODING_INVALID_REQUEST_ERROR(false, HttpStatus.BAD_REQUEST.value(), "지오코딩 서버의 알 수 없는 오류입니다. 다시 요청해주세요."), + GEOCODING_UNKNOWN_ADDRESS_ERROR(false, HttpStatus.BAD_REQUEST.value(), "찾을 수 없는 주소입니다. 주소를 다시 확인해주세요."), + GEOCODING_QUERY_MISSING_ERROR(false, HttpStatus.BAD_REQUEST.value(), "지오코딩 쿼리가 없습니다. 다시 요청해주세요.") ; private Boolean isSuccess; diff --git a/src/main/java/com/kusitms/jipbap/user/UserAddressController.java b/src/main/java/com/kusitms/jipbap/user/UserAddressController.java index 04c5342..2d144cc 100644 --- a/src/main/java/com/kusitms/jipbap/user/UserAddressController.java +++ b/src/main/java/com/kusitms/jipbap/user/UserAddressController.java @@ -1,10 +1,7 @@ package com.kusitms.jipbap.user; import com.kusitms.jipbap.common.response.CommonResponse; -import com.kusitms.jipbap.user.dto.address.GlobalRegionRequest; -import com.kusitms.jipbap.user.dto.address.GlobalRegionResponse; -import com.kusitms.jipbap.user.dto.address.UserAddressRequest; -import com.kusitms.jipbap.user.dto.address.UserAddressResponse; +import com.kusitms.jipbap.user.dto.address.*; import com.kusitms.jipbap.user.entity.GlobalRegion; import com.kusitms.jipbap.user.repository.GlobalRegionRepository; import io.swagger.v3.oas.annotations.Operation; @@ -29,6 +26,13 @@ public CommonResponse saveUserAddress(@Valid @RequestBody U return new CommonResponse<>(userAddressService.saveUserAddress(dto)); } + @Operation(summary = "유효한 주소인지 확인하고 우편번호 반환하기") + @GetMapping("/valid") + @ResponseStatus(HttpStatus.OK) + public CommonResponse getValidPostalCode(@RequestParam String address) { + return new CommonResponse<>(userAddressService.getValidPostalCode(address)); + } + @Operation(summary = "지역 코드 데이터 저장하기") @PostMapping("/global-area") @ResponseStatus(HttpStatus.CREATED) diff --git a/src/main/java/com/kusitms/jipbap/user/UserAddressExceptionController.java b/src/main/java/com/kusitms/jipbap/user/UserAddressExceptionController.java index 6c88579..c8e86a0 100644 --- a/src/main/java/com/kusitms/jipbap/user/UserAddressExceptionController.java +++ b/src/main/java/com/kusitms/jipbap/user/UserAddressExceptionController.java @@ -2,8 +2,7 @@ import com.kusitms.jipbap.common.response.CommonResponse; import com.kusitms.jipbap.common.response.ErrorCode; -import com.kusitms.jipbap.user.exception.RegionNotFoundException; -import com.kusitms.jipbap.user.exception.RegionExistsException; +import com.kusitms.jipbap.user.exception.*; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; @@ -27,4 +26,32 @@ public CommonResponse RegionNotFoundException(RegionNotFoundException e, Http log.warn("UserAddress-002> 요청 URI: " + request.getRequestURI() + ", 에러 메세지: " + e.getMessage()); return new CommonResponse<>(ErrorCode.REGION_NOT_FOUND_ERROR); } + + @ExceptionHandler(GeocodingConnectionException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public CommonResponse GeocodingConnectionException(GeocodingConnectionException e, HttpServletRequest request) { + log.warn("UserAddress-003> 요청 URI: " + request.getRequestURI() + ", 에러 메세지: " + e.getMessage()); + return new CommonResponse<>(ErrorCode.GEOCODING_CONNECTION_ERROR); + } + + @ExceptionHandler(GeocodingUnknownAddressException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public CommonResponse GeocodingUnknownAddressException(GeocodingUnknownAddressException e, HttpServletRequest request) { + log.warn("UserAddress-004> 요청 URI: " + request.getRequestURI() + ", 에러 메세지: " + e.getMessage()); + return new CommonResponse<>(ErrorCode.GEOCODING_UNKNOWN_ADDRESS_ERROR); + } + + @ExceptionHandler(GeocodingInvalidRequestException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public CommonResponse GeocodingInvalidRequestException(GeocodingInvalidRequestException e, HttpServletRequest request) { + log.warn("UserAddress-005> 요청 URI: " + request.getRequestURI() + ", 에러 메세지: " + e.getMessage()); + return new CommonResponse<>(ErrorCode.GEOCODING_INVALID_REQUEST_ERROR); + } + + @ExceptionHandler(GeocodingQueryMissingException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public CommonResponse GeocodingQueryMissingException(GeocodingQueryMissingException e, HttpServletRequest request) { + log.warn("UserAddress-006> 요청 URI: " + request.getRequestURI() + ", 에러 메세지: " + e.getMessage()); + return new CommonResponse<>(ErrorCode.GEOCODING_QUERY_MISSING_ERROR); + } } diff --git a/src/main/java/com/kusitms/jipbap/user/UserAddressService.java b/src/main/java/com/kusitms/jipbap/user/UserAddressService.java index a3d978b..63eefd3 100644 --- a/src/main/java/com/kusitms/jipbap/user/UserAddressService.java +++ b/src/main/java/com/kusitms/jipbap/user/UserAddressService.java @@ -1,9 +1,6 @@ package com.kusitms.jipbap.user; -import com.kusitms.jipbap.user.dto.address.GlobalRegionRequest; -import com.kusitms.jipbap.user.dto.address.GlobalRegionResponse; -import com.kusitms.jipbap.user.dto.address.UserAddressRequest; -import com.kusitms.jipbap.user.dto.address.UserAddressResponse; +import com.kusitms.jipbap.user.dto.address.*; import com.kusitms.jipbap.user.dto.geolocation.AddressComponentDto; import com.kusitms.jipbap.user.dto.geolocation.GeocodingAddressDto; import com.kusitms.jipbap.user.dto.geolocation.GeocodingResponseDto; @@ -12,7 +9,6 @@ import com.kusitms.jipbap.user.repository.GlobalRegionRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.json.JSONObject; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -35,7 +31,7 @@ public class UserAddressService { @Transactional public UserAddressResponse saveUserAddress(UserAddressRequest dto) { User user = userRepository.findById(dto.getUserId()) - .orElseThrow(()-> new UserNotFoundException("유저 정보가 존재하지 않습니다.")); + .orElseThrow(() -> new UserNotFoundException("유저 정보가 존재하지 않습니다.")); GlobalRegion globalRegion = globalRegionRepository.findById(dto.getGlobalRegionId()) .orElseThrow(() -> new RegionNotFoundException("지역 정보가 존재하지 않습니다.")); @@ -45,7 +41,8 @@ public UserAddressResponse saveUserAddress(UserAddressRequest dto) { } public GlobalRegionResponse saveGlobalAreaData(GlobalRegionRequest dto) { - if(globalRegionRepository.existsByRegionName(dto.getRegionName())) throw new RegionExistsException("이미 존재하는 지역입니다."); + if (globalRegionRepository.existsByRegionName(dto.getRegionName())) + throw new RegionExistsException("이미 존재하는 지역입니다."); GlobalRegion globalRegion = globalRegionRepository.save(dto.toEntity()); return new GlobalRegionResponse(globalRegion); @@ -62,11 +59,11 @@ public List getAllGlobalAreaData() { } @Transactional - public void getGeoDataByAddress(String address){ - JSONObject geocodingData = getGeocodingData(address); + public PostalAddressDto getValidPostalCode(String address) { + return getGeocodingData(address); } - private JSONObject getGeocodingData(String address) { + private PostalAddressDto getGeocodingData(String address) { try { String apiUrl = "https://maps.googleapis.com/maps/api/geocode/json?address=" + address + "&key=" + apiKey; @@ -75,27 +72,25 @@ private JSONObject getGeocodingData(String address) { //String response = restTemplate.getForObject(apiUrl, String.class); log.info("{} 주소에 대한 getGeocodingData API response 결과 : {} ", address, responseDto.getStatus()); - if ("OK".equals(responseDto.getStatus())) { - saveUserAddress(responseDto.getResults().get(0)); - } else if ("ZERO_RESULTS".equals(responseDto.getStatus())){ - throw new GeocodingUnknownAdressException("주소가 존재하지 않습니다."); - } else if ("OVER_DAILY_LIMIT".equals(responseDto.getStatus())) { - throw new GeocodingConnectionException("API키가 잘못되었거나 결제가 사용 설정 되지 않았습니다."); - } else if ("OVER_QUERY_LIMIT".equals(responseDto.getStatus())) { - throw new GeocodingConnectionException("할당량이 초과되었습니다."); - } else if ("REQUEST_DENIED".equals(responseDto.getStatus())) { - throw new GeocodingConnectionException("요청이 거부되었습니다."); - } else if ("INVALID_REQUEST".equals(responseDto.getStatus())) { - throw new GeocodingUnknownAdressException("쿼리가 누락되었습니다."); - } else if ("UNKNOWN_ERROR".equals(responseDto.getStatus())) { - throw new GeocodingConnectionException("서버 에러입니다."); - } else { - throw new GeocodingConnectionException("그 외의 오류가 발생했습니다."); + switch (responseDto.getStatus()) { + case "OK": + return findPostalAddress(responseDto.getResults().get(0)); + case "ZERO_RESULTS": + throw new GeocodingUnknownAddressException("주소가 존재하지 않습니다."); + case "OVER_DAILY_LIMIT": + case "OVER_QUERY_LIMIT": + case "REQUEST_DENIED": + throw new GeocodingConnectionException("API키가 잘못되었거나 결제가 사용 설정 되지 않았습니다."); + case "INVALID_REQUEST": + throw new GeocodingQueryMissingException("쿼리가 누락되었습니다."); + case "UNKNOWN_ERROR": + throw new GeocodingUnknownAddressException("알 수 없는 지오코딩 에러입니다."); + default: + throw new GeocodingConnectionException("서버 에러입니다."); } - return new JSONObject(responseDto); } catch (Exception e) { - e.printStackTrace(); - return null; + //e.printStackTrace(); + throw e; } } @@ -106,7 +101,7 @@ private void setUserData(User user, GlobalRegion globalRegion, UserAddressReques user.setPostalCode(dto.getPostalCode()); } - private void saveUserAddress(GeocodingAddressDto geocodingAddressDto) { + private PostalAddressDto findPostalAddress(GeocodingAddressDto geocodingAddressDto) { try { String formattedAddress = geocodingAddressDto.getFormattedAddress(); // 실제 데이터베이스에 저장할 주소 @@ -121,11 +116,13 @@ private void saveUserAddress(GeocodingAddressDto geocodingAddressDto) { countryName = addressComponent.getLongName(); } if (types != null && types.contains("postal_code")) { - postalCode= addressComponent.getLongName(); + postalCode = addressComponent.getLongName(); } } + return new PostalAddressDto(formattedAddress, postalCode); } catch (NullPointerException e) { e.printStackTrace(); } + return null; } } diff --git a/src/main/java/com/kusitms/jipbap/user/dto/address/PostalAddressDto.java b/src/main/java/com/kusitms/jipbap/user/dto/address/PostalAddressDto.java new file mode 100644 index 0000000..f1afbdf --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/dto/address/PostalAddressDto.java @@ -0,0 +1,15 @@ +package com.kusitms.jipbap.user.dto.address; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class PostalAddressDto { + String formattedAddress; + String postalCode; +} diff --git a/src/main/java/com/kusitms/jipbap/user/exception/GeocodingConnectionException.java b/src/main/java/com/kusitms/jipbap/user/exception/GeocodingConnectionException.java new file mode 100644 index 0000000..9c165a7 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/exception/GeocodingConnectionException.java @@ -0,0 +1,7 @@ +package com.kusitms.jipbap.user.exception; + +public class GeocodingConnectionException extends RuntimeException { + public GeocodingConnectionException(String message) { + super(message); + } +} \ No newline at end of file diff --git a/src/main/java/com/kusitms/jipbap/user/exception/GeocodingInvalidRequestException.java b/src/main/java/com/kusitms/jipbap/user/exception/GeocodingInvalidRequestException.java new file mode 100644 index 0000000..82f5557 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/exception/GeocodingInvalidRequestException.java @@ -0,0 +1,7 @@ +package com.kusitms.jipbap.user.exception; + +public class GeocodingInvalidRequestException extends RuntimeException { + public GeocodingInvalidRequestException(String message) { + super(message); + } +} \ No newline at end of file diff --git a/src/main/java/com/kusitms/jipbap/user/exception/GeocodingQueryMissingException.java b/src/main/java/com/kusitms/jipbap/user/exception/GeocodingQueryMissingException.java new file mode 100644 index 0000000..52cf103 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/exception/GeocodingQueryMissingException.java @@ -0,0 +1,7 @@ +package com.kusitms.jipbap.user.exception; + +public class GeocodingQueryMissingException extends RuntimeException { + public GeocodingQueryMissingException(String message) { + super(message); + } +} diff --git a/src/main/java/com/kusitms/jipbap/user/exception/GeocodingUnknownAddressException.java b/src/main/java/com/kusitms/jipbap/user/exception/GeocodingUnknownAddressException.java new file mode 100644 index 0000000..35fccd7 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/user/exception/GeocodingUnknownAddressException.java @@ -0,0 +1,7 @@ +package com.kusitms.jipbap.user.exception; + +public class GeocodingUnknownAddressException extends RuntimeException { + public GeocodingUnknownAddressException(String message) { + super(message); + } +} \ No newline at end of file From c3de33a69766628a16278ec229f7dbcedb104c77 Mon Sep 17 00:00:00 2001 From: summit45 Date: Tue, 14 Nov 2023 18:28:36 +0900 Subject: [PATCH 10/10] =?UTF-8?q?fix:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20import=20=EB=AC=B8=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/kusitms/jipbap/user/entity/GlobalRegion.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/com/kusitms/jipbap/user/entity/GlobalRegion.java b/src/main/java/com/kusitms/jipbap/user/entity/GlobalRegion.java index ae09c92..8476d01 100644 --- a/src/main/java/com/kusitms/jipbap/user/entity/GlobalRegion.java +++ b/src/main/java/com/kusitms/jipbap/user/entity/GlobalRegion.java @@ -1,11 +1,8 @@ package com.kusitms.jipbap.user.entity; -import com.kusitms.jipbap.user.entity.area.AdministrativeArea; import jakarta.persistence.*; import lombok.*; -import java.util.List; - @Builder @Entity @Table(name = "tb_global_region")