From 341f930b740f5231c03025c7fdb3ea330b550d77 Mon Sep 17 00:00:00 2001 From: imscow11253 Date: Mon, 6 Jan 2025 16:25:39 +0900 Subject: [PATCH 1/8] =?UTF-8?q?feat(presentation)=20:=20=EA=B4=80=ED=95=A0?= =?UTF-8?q?=EC=84=9C=20=EC=A3=BC=EC=86=8C=20=EA=B2=80=EC=83=89=20API=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../address/dto/SearchAddressRequest.java | 9 +++++++ .../address/dto/SearchAddressResponse.java | 6 +++++ .../address/service/AddressService.java | 15 +++++++++++ .../baseResponse/BaseResponseMessage.java | 4 ++- .../controller/AddressController.java | 25 +++++++++++++++++++ ...=> DTOFieldExceptionControllerAdvice.java} | 6 +++-- 6 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/neighbors/tohero/application/address/dto/SearchAddressRequest.java create mode 100644 src/main/java/com/neighbors/tohero/application/address/dto/SearchAddressResponse.java create mode 100644 src/main/java/com/neighbors/tohero/application/address/service/AddressService.java create mode 100644 src/main/java/com/neighbors/tohero/presentation/controller/AddressController.java rename src/main/java/com/neighbors/tohero/presentation/exception_handler/{UserExceptionControllerAdvice.java => DTOFieldExceptionControllerAdvice.java} (81%) diff --git a/src/main/java/com/neighbors/tohero/application/address/dto/SearchAddressRequest.java b/src/main/java/com/neighbors/tohero/application/address/dto/SearchAddressRequest.java new file mode 100644 index 0000000..ecaed25 --- /dev/null +++ b/src/main/java/com/neighbors/tohero/application/address/dto/SearchAddressRequest.java @@ -0,0 +1,9 @@ +package com.neighbors.tohero.application.address.dto; + +import org.hibernate.validator.constraints.Length; + +public record SearchAddressRequest ( + @Length(min = 1, max = 50) + String searchAddress +){ +} diff --git a/src/main/java/com/neighbors/tohero/application/address/dto/SearchAddressResponse.java b/src/main/java/com/neighbors/tohero/application/address/dto/SearchAddressResponse.java new file mode 100644 index 0000000..6401e38 --- /dev/null +++ b/src/main/java/com/neighbors/tohero/application/address/dto/SearchAddressResponse.java @@ -0,0 +1,6 @@ +package com.neighbors.tohero.application.address.dto; + +public record SearchAddressResponse ( + +){ +} diff --git a/src/main/java/com/neighbors/tohero/application/address/service/AddressService.java b/src/main/java/com/neighbors/tohero/application/address/service/AddressService.java new file mode 100644 index 0000000..db1b461 --- /dev/null +++ b/src/main/java/com/neighbors/tohero/application/address/service/AddressService.java @@ -0,0 +1,15 @@ +package com.neighbors.tohero.application.address.service; + +import com.neighbors.tohero.application.address.dto.SearchAddressRequest; +import com.neighbors.tohero.application.address.dto.SearchAddressResponse; +import com.neighbors.tohero.application.baseResponse.BaseResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class AddressService { + public BaseResponse searchAddress(SearchAddressRequest searchAddressRequest) { + return null; + } +} diff --git a/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseMessage.java b/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseMessage.java index 0d2b17b..6e7ff8c 100644 --- a/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseMessage.java +++ b/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseMessage.java @@ -25,8 +25,10 @@ public enum BaseResponseMessage { //main page 메인페이지_조회가_정상적으로_실행되었습니다("메인페이지 조회가 정상적으로 실행되었습니다"), - 메인페이지_편지_무한페이징_조회가_정상적으로_실행되었습니다("메인페이지 편지 무한페이징 조회가 정상적으로 실행되었습니다"); + 메인페이지_편지_무한페이징_조회가_정상적으로_실행되었습니다("메인페이지 편지 무한페이징 조회가 정상적으로 실행되었습니다"), + //address + 주소_검색_쿼리의_길이는_1부터_50까지만_가능합니다("주소 검색 쿼리의 길이는 1부터 50까지만 가능합니다"); private final String message; diff --git a/src/main/java/com/neighbors/tohero/presentation/controller/AddressController.java b/src/main/java/com/neighbors/tohero/presentation/controller/AddressController.java new file mode 100644 index 0000000..aa04dae --- /dev/null +++ b/src/main/java/com/neighbors/tohero/presentation/controller/AddressController.java @@ -0,0 +1,25 @@ +package com.neighbors.tohero.presentation.controller; + +import com.neighbors.tohero.application.address.dto.SearchAddressRequest; +import com.neighbors.tohero.application.address.service.AddressService; +import com.neighbors.tohero.application.baseResponse.BaseResponse; +import lombok.RequiredArgsConstructor; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("") +public class AddressController { + + private final AddressService addressService; + + @GetMapping("/address") + public ResponseEntity searchAddress(@ParameterObject SearchAddressRequest searchAddressRequest) { + return ResponseEntity.ok() + .body(addressService.searchAddress(searchAddressRequest)); + } +} diff --git a/src/main/java/com/neighbors/tohero/presentation/exception_handler/UserExceptionControllerAdvice.java b/src/main/java/com/neighbors/tohero/presentation/exception_handler/DTOFieldExceptionControllerAdvice.java similarity index 81% rename from src/main/java/com/neighbors/tohero/presentation/exception_handler/UserExceptionControllerAdvice.java rename to src/main/java/com/neighbors/tohero/presentation/exception_handler/DTOFieldExceptionControllerAdvice.java index 34b577f..7f1d2d6 100644 --- a/src/main/java/com/neighbors/tohero/presentation/exception_handler/UserExceptionControllerAdvice.java +++ b/src/main/java/com/neighbors/tohero/presentation/exception_handler/DTOFieldExceptionControllerAdvice.java @@ -15,16 +15,18 @@ import java.util.Map; import static com.neighbors.tohero.application.baseResponse.BaseResponseMessage.유저_이름의_길이는_1부터_5까지만_가능합니다; +import static com.neighbors.tohero.application.baseResponse.BaseResponseMessage.주소_검색_쿼리의_길이는_1부터_50까지만_가능합니다; @Priority(0) @RestControllerAdvice -public class UserExceptionControllerAdvice { +public class DTOFieldExceptionControllerAdvice { private final Map fieldErrorMapper; - public UserExceptionControllerAdvice() { + public DTOFieldExceptionControllerAdvice() { fieldErrorMapper = new HashMap<>(); fieldErrorMapper.put("nickname", 유저_이름의_길이는_1부터_5까지만_가능합니다); + fieldErrorMapper.put("searchAddress", 주소_검색_쿼리의_길이는_1부터_50까지만_가능합니다); } @ResponseStatus(HttpStatus.BAD_REQUEST) From 4e53b3b6ff70a80afdeaa61e21b196bb0631109c Mon Sep 17 00:00:00 2001 From: imscow11253 Date: Mon, 6 Jan 2025 16:29:09 +0900 Subject: [PATCH 2/8] =?UTF-8?q?feat(validation)=20:=20=EA=B4=80=ED=95=A0?= =?UTF-8?q?=EC=84=9C=20=EC=A3=BC=EC=86=8C=20=EA=B2=80=EC=83=89=20requestDT?= =?UTF-8?q?O=20validation=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tohero/application/address/dto/SearchAddressRequest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/neighbors/tohero/application/address/dto/SearchAddressRequest.java b/src/main/java/com/neighbors/tohero/application/address/dto/SearchAddressRequest.java index ecaed25..0a581b4 100644 --- a/src/main/java/com/neighbors/tohero/application/address/dto/SearchAddressRequest.java +++ b/src/main/java/com/neighbors/tohero/application/address/dto/SearchAddressRequest.java @@ -1,9 +1,11 @@ package com.neighbors.tohero.application.address.dto; +import jakarta.validation.constraints.NotBlank; import org.hibernate.validator.constraints.Length; public record SearchAddressRequest ( @Length(min = 1, max = 50) + @NotBlank String searchAddress ){ } From e39fe7c1327e16f60e5e56d0ec2eb799fd44d89b Mon Sep 17 00:00:00 2001 From: imscow11253 Date: Mon, 6 Jan 2025 16:49:23 +0900 Subject: [PATCH 3/8] =?UTF-8?q?feat(application)=20:=20=EA=B4=80=ED=95=A0?= =?UTF-8?q?=EC=84=9C=20=EC=A3=BC=EC=86=8C=20=EA=B2=80=EC=83=89=20API=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../address/dto/SearchAddressResponse.java | 24 ++++++++++++++++++- .../address/service/AddressService.java | 22 ++++++++++++++++- .../baseResponse/BaseResponseMessage.java | 5 +++- .../baseResponse/BaseResponseStatus.java | 2 +- .../exception/address/AddressException.java | 14 +++++++++++ .../domain/domain/address/model/Address.java | 12 ++++++++++ .../domain/address/service/GetAddress.java | 15 ++++++++++++ 7 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/neighbors/tohero/common/exception/address/AddressException.java create mode 100644 src/main/java/com/neighbors/tohero/domain/domain/address/model/Address.java create mode 100644 src/main/java/com/neighbors/tohero/domain/domain/address/service/GetAddress.java diff --git a/src/main/java/com/neighbors/tohero/application/address/dto/SearchAddressResponse.java b/src/main/java/com/neighbors/tohero/application/address/dto/SearchAddressResponse.java index 6401e38..db2f3e1 100644 --- a/src/main/java/com/neighbors/tohero/application/address/dto/SearchAddressResponse.java +++ b/src/main/java/com/neighbors/tohero/application/address/dto/SearchAddressResponse.java @@ -1,6 +1,28 @@ package com.neighbors.tohero.application.address.dto; -public record SearchAddressResponse ( +import com.neighbors.tohero.domain.domain.address.model.Address; + +import java.util.List; +public record SearchAddressResponse ( + List addressInfos ){ + public record AddressInfo( + long addressId, + String officeName, + String roadAddress + ) { + public static AddressInfo from(Address address) { + return new AddressInfo(address.getAddressId(), address.getOfficeName(), address.getRoadAddress()); + } + } + + public static SearchAddressResponse from(List
searchedAddresses) { + + List addressInfos = searchedAddresses.stream() + .map(AddressInfo::from) + .toList(); + + return new SearchAddressResponse(addressInfos); + } } diff --git a/src/main/java/com/neighbors/tohero/application/address/service/AddressService.java b/src/main/java/com/neighbors/tohero/application/address/service/AddressService.java index db1b461..6cacce8 100644 --- a/src/main/java/com/neighbors/tohero/application/address/service/AddressService.java +++ b/src/main/java/com/neighbors/tohero/application/address/service/AddressService.java @@ -3,13 +3,33 @@ import com.neighbors.tohero.application.address.dto.SearchAddressRequest; import com.neighbors.tohero.application.address.dto.SearchAddressResponse; import com.neighbors.tohero.application.baseResponse.BaseResponse; +import com.neighbors.tohero.application.baseResponse.BaseResponseMessage; +import com.neighbors.tohero.application.baseResponse.BaseResponseStatus; +import com.neighbors.tohero.common.exception.address.AddressException; +import com.neighbors.tohero.domain.domain.address.model.Address; +import com.neighbors.tohero.domain.domain.address.service.GetAddress; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.util.List; + @Service @RequiredArgsConstructor public class AddressService { + + private final GetAddress getAddress; + public BaseResponse searchAddress(SearchAddressRequest searchAddressRequest) { - return null; + List
searchedAddresses = getAddress.searchAddressByPath(searchAddressRequest.searchAddress()); + + if(searchedAddresses.isEmpty()) { + throw new AddressException(BaseResponseStatus.NO_RESULT, BaseResponseMessage.일치하는_관할서_정보가_없습니다.getMessage()); + } + + return new BaseResponse( + BaseResponseStatus.OK, + BaseResponseMessage.주소_검색이_성공적으로_응답되었습니다.getMessage(), + SearchAddressResponse.from(searchedAddresses) + ); } } diff --git a/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseMessage.java b/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseMessage.java index 6e7ff8c..4ff0299 100644 --- a/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseMessage.java +++ b/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseMessage.java @@ -28,7 +28,10 @@ public enum BaseResponseMessage { 메인페이지_편지_무한페이징_조회가_정상적으로_실행되었습니다("메인페이지 편지 무한페이징 조회가 정상적으로 실행되었습니다"), //address - 주소_검색_쿼리의_길이는_1부터_50까지만_가능합니다("주소 검색 쿼리의 길이는 1부터 50까지만 가능합니다"); + 주소_검색_쿼리의_길이는_1부터_50까지만_가능합니다("주소 검색 쿼리의 길이는 1부터 50까지만 가능합니다"), + 일치하는_관할서_정보가_없습니다("일치하는 관할서 정보가 없습니다"), + 주소_검색이_성공적으로_응답되었습니다("주소 검색이 성공적으로 응답되었습니다"); + private final String message; diff --git a/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseStatus.java b/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseStatus.java index 23bd58c..a5b3315 100644 --- a/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseStatus.java +++ b/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseStatus.java @@ -1,5 +1,5 @@ package com.neighbors.tohero.application.baseResponse; public enum BaseResponseStatus { - OK, BAD_REQUEST, JWT_ERROR; + OK, BAD_REQUEST, JWT_ERROR, NO_RESULT; } diff --git a/src/main/java/com/neighbors/tohero/common/exception/address/AddressException.java b/src/main/java/com/neighbors/tohero/common/exception/address/AddressException.java new file mode 100644 index 0000000..3a9c034 --- /dev/null +++ b/src/main/java/com/neighbors/tohero/common/exception/address/AddressException.java @@ -0,0 +1,14 @@ +package com.neighbors.tohero.common.exception.address; + +import com.neighbors.tohero.application.baseResponse.BaseResponseStatus; + +public class AddressException extends RuntimeException{ + private final BaseResponseStatus status; + private final String message; + + public AddressException(BaseResponseStatus status, String message) { + super(message); + this.status = status; + this.message = message; + } +} diff --git a/src/main/java/com/neighbors/tohero/domain/domain/address/model/Address.java b/src/main/java/com/neighbors/tohero/domain/domain/address/model/Address.java new file mode 100644 index 0000000..9f536a7 --- /dev/null +++ b/src/main/java/com/neighbors/tohero/domain/domain/address/model/Address.java @@ -0,0 +1,12 @@ +package com.neighbors.tohero.domain.domain.address.model; + +import lombok.Getter; + +@Getter +public class Address { + private long addressId; + private String officeName; + private String roadAddress; + private String phoneNumber; + private String queryPath; +} diff --git a/src/main/java/com/neighbors/tohero/domain/domain/address/service/GetAddress.java b/src/main/java/com/neighbors/tohero/domain/domain/address/service/GetAddress.java new file mode 100644 index 0000000..2b5cdd1 --- /dev/null +++ b/src/main/java/com/neighbors/tohero/domain/domain/address/service/GetAddress.java @@ -0,0 +1,15 @@ +package com.neighbors.tohero.domain.domain.address.service; + +import com.neighbors.tohero.common.annotaion.DomainService; +import com.neighbors.tohero.domain.domain.address.model.Address; +import lombok.RequiredArgsConstructor; + +import java.util.List; + +@DomainService +@RequiredArgsConstructor +public class GetAddress { + public List
searchAddressByPath(String queryPath){ + return null; + } +} From 425a157f10b2789f722c256829d2535ce365ab2d Mon Sep 17 00:00:00 2001 From: imscow11253 Date: Mon, 6 Jan 2025 16:52:10 +0900 Subject: [PATCH 4/8] =?UTF-8?q?feat(domain)=20:=20=EA=B4=80=ED=95=A0?= =?UTF-8?q?=EC=84=9C=20=EC=A3=BC=EC=86=8C=20=EA=B2=80=EC=83=89=20API=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/domain/address/service/GetAddress.java | 6 +++++- .../tohero/domain/query/AddressRepository.java | 11 +++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/neighbors/tohero/domain/query/AddressRepository.java diff --git a/src/main/java/com/neighbors/tohero/domain/domain/address/service/GetAddress.java b/src/main/java/com/neighbors/tohero/domain/domain/address/service/GetAddress.java index 2b5cdd1..751d2ed 100644 --- a/src/main/java/com/neighbors/tohero/domain/domain/address/service/GetAddress.java +++ b/src/main/java/com/neighbors/tohero/domain/domain/address/service/GetAddress.java @@ -2,6 +2,7 @@ import com.neighbors.tohero.common.annotaion.DomainService; import com.neighbors.tohero.domain.domain.address.model.Address; +import com.neighbors.tohero.domain.query.AddressRepository; import lombok.RequiredArgsConstructor; import java.util.List; @@ -9,7 +10,10 @@ @DomainService @RequiredArgsConstructor public class GetAddress { + + private final AddressRepository addressRepository; + public List
searchAddressByPath(String queryPath){ - return null; + return addressRepository.searchAddressByPath(queryPath); } } diff --git a/src/main/java/com/neighbors/tohero/domain/query/AddressRepository.java b/src/main/java/com/neighbors/tohero/domain/query/AddressRepository.java new file mode 100644 index 0000000..4775190 --- /dev/null +++ b/src/main/java/com/neighbors/tohero/domain/query/AddressRepository.java @@ -0,0 +1,11 @@ +package com.neighbors.tohero.domain.query; + +import com.neighbors.tohero.domain.domain.address.model.Address; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface AddressRepository { + List
searchAddressByPath(String queryPath); +} From dc96e082f32d6d2de8923150d8a2d80523b6c7b2 Mon Sep 17 00:00:00 2001 From: imscow11253 Date: Mon, 6 Jan 2025 17:16:04 +0900 Subject: [PATCH 5/8] =?UTF-8?q?feat(infrastructure)=20:=20=EA=B4=80?= =?UTF-8?q?=ED=95=A0=EC=84=9C=20=EC=A3=BC=EC=86=8C=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?API=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/domain/address/model/Address.java | 6 +++ .../domain/query/AddressRepository.java | 3 +- .../infrastructure/entity/AddressEntity.java | 2 + .../infrastructure/mapper/AddressMapper.java | 18 +++++++++ .../query/impl/AddressRepositoryImpl.java | 37 +++++++++++++++++++ .../repository/AddressEntityRepository.java | 17 +++++++++ 6 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/neighbors/tohero/infrastructure/mapper/AddressMapper.java create mode 100644 src/main/java/com/neighbors/tohero/infrastructure/query/impl/AddressRepositoryImpl.java create mode 100644 src/main/java/com/neighbors/tohero/infrastructure/repository/AddressEntityRepository.java diff --git a/src/main/java/com/neighbors/tohero/domain/domain/address/model/Address.java b/src/main/java/com/neighbors/tohero/domain/domain/address/model/Address.java index 9f536a7..a130b72 100644 --- a/src/main/java/com/neighbors/tohero/domain/domain/address/model/Address.java +++ b/src/main/java/com/neighbors/tohero/domain/domain/address/model/Address.java @@ -1,12 +1,18 @@ package com.neighbors.tohero.domain.domain.address.model; +import lombok.AllArgsConstructor; import lombok.Getter; @Getter +@AllArgsConstructor public class Address { private long addressId; private String officeName; private String roadAddress; private String phoneNumber; private String queryPath; + + public static Address of(long addressId, String officeName, String roadAddress, String phoneNumber, String queryPath){ + return new Address(addressId, officeName, roadAddress, phoneNumber, queryPath); + } } diff --git a/src/main/java/com/neighbors/tohero/domain/query/AddressRepository.java b/src/main/java/com/neighbors/tohero/domain/query/AddressRepository.java index 4775190..ab166f1 100644 --- a/src/main/java/com/neighbors/tohero/domain/query/AddressRepository.java +++ b/src/main/java/com/neighbors/tohero/domain/query/AddressRepository.java @@ -1,11 +1,10 @@ package com.neighbors.tohero.domain.query; import com.neighbors.tohero.domain.domain.address.model.Address; -import org.springframework.stereotype.Repository; import java.util.List; -@Repository public interface AddressRepository { List
searchAddressByPath(String queryPath); + List
searchAddressByRoadAddress(String queryRoadAddress); } diff --git a/src/main/java/com/neighbors/tohero/infrastructure/entity/AddressEntity.java b/src/main/java/com/neighbors/tohero/infrastructure/entity/AddressEntity.java index a24b7f3..6105d4f 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/entity/AddressEntity.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/entity/AddressEntity.java @@ -2,9 +2,11 @@ import com.neighbors.tohero.infrastructure.entity.base.BaseEntity; import jakarta.persistence.*; +import lombok.Getter; @Entity @Table(name = "`Address`") +@Getter public class AddressEntity extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/neighbors/tohero/infrastructure/mapper/AddressMapper.java b/src/main/java/com/neighbors/tohero/infrastructure/mapper/AddressMapper.java new file mode 100644 index 0000000..95bcae6 --- /dev/null +++ b/src/main/java/com/neighbors/tohero/infrastructure/mapper/AddressMapper.java @@ -0,0 +1,18 @@ +package com.neighbors.tohero.infrastructure.mapper; + +import com.neighbors.tohero.domain.domain.address.model.Address; +import com.neighbors.tohero.infrastructure.entity.AddressEntity; +import org.springframework.stereotype.Component; + +@Component +public class AddressMapper { + public Address toDomain(AddressEntity addressEntity) { + return Address.of( + addressEntity.getAddressId(), + addressEntity.getBranchOffice(), + addressEntity.getRoadAddress(), + addressEntity.getPhoneNumber(), + addressEntity.getQueryPath() + ); + } +} diff --git a/src/main/java/com/neighbors/tohero/infrastructure/query/impl/AddressRepositoryImpl.java b/src/main/java/com/neighbors/tohero/infrastructure/query/impl/AddressRepositoryImpl.java new file mode 100644 index 0000000..a7ad8bf --- /dev/null +++ b/src/main/java/com/neighbors/tohero/infrastructure/query/impl/AddressRepositoryImpl.java @@ -0,0 +1,37 @@ +package com.neighbors.tohero.infrastructure.query.impl; + +import com.neighbors.tohero.domain.domain.address.model.Address; +import com.neighbors.tohero.domain.query.AddressRepository; +import com.neighbors.tohero.infrastructure.entity.AddressEntity; +import com.neighbors.tohero.infrastructure.mapper.AddressMapper; +import com.neighbors.tohero.infrastructure.repository.AddressEntityRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class AddressRepositoryImpl implements AddressRepository { + + private final AddressEntityRepository addressEntityRepository; + private final AddressMapper addressMapper; + + @Override + public List
searchAddressByPath(String queryPath) { + List addressEntities = addressEntityRepository.findAllContainsPath(queryPath); + + return addressEntities.stream() + .map(addressMapper::toDomain) + .toList(); + } + + @Override + public List
searchAddressByRoadAddress(String queryRoadAddress) { + List addressEntities = addressEntityRepository.findAllContainsRoadAddress(queryRoadAddress); + + return addressEntities.stream() + .map(addressMapper::toDomain) + .toList(); + } +} diff --git a/src/main/java/com/neighbors/tohero/infrastructure/repository/AddressEntityRepository.java b/src/main/java/com/neighbors/tohero/infrastructure/repository/AddressEntityRepository.java new file mode 100644 index 0000000..208df77 --- /dev/null +++ b/src/main/java/com/neighbors/tohero/infrastructure/repository/AddressEntityRepository.java @@ -0,0 +1,17 @@ +package com.neighbors.tohero.infrastructure.repository; + +import com.neighbors.tohero.infrastructure.entity.AddressEntity; +import io.lettuce.core.dynamic.annotation.Param; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; + +public interface AddressEntityRepository extends JpaRepository { + + @Query("SELECT a FROM AddressEntity a WHERE a.queryPath LIKE %:queryPath%") + List findAllContainsPath(@Param("queryPath") String queryPath); + + @Query("SELECT a FROM AddressEntity a WHERE a.roadAddress LIKE %:queryRoadAddress%") + List findAllContainsRoadAddress(@Param("queryRoadAddress") String queryRoadAddress); +} From 8f3621dd1e9acc21468101926ef8fe10628cda93 Mon Sep 17 00:00:00 2001 From: imscow11253 Date: Mon, 6 Jan 2025 17:59:03 +0900 Subject: [PATCH 6/8] =?UTF-8?q?refactor=20:=20=EA=B4=80=ED=95=A0=EC=84=9C?= =?UTF-8?q?=20=EC=A3=BC=EC=86=8C=20=EA=B2=80=EC=83=89=20API=20=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EB=8F=84=EB=A1=9C=EB=AA=85=20=EC=A3=BC=EC=86=8C?= =?UTF-8?q?=EB=8F=84=20=EA=B0=80=EB=8A=A5=ED=95=98=EA=B2=8C=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../address/service/AddressService.java | 20 ++++++++++++++++++- .../domain/address/service/GetAddress.java | 8 ++++++-- .../domain/query/AddressRepository.java | 2 +- .../query/impl/AddressRepositoryImpl.java | 4 ++-- .../repository/AddressEntityRepository.java | 2 +- 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/neighbors/tohero/application/address/service/AddressService.java b/src/main/java/com/neighbors/tohero/application/address/service/AddressService.java index 6cacce8..4824fbb 100644 --- a/src/main/java/com/neighbors/tohero/application/address/service/AddressService.java +++ b/src/main/java/com/neighbors/tohero/application/address/service/AddressService.java @@ -11,7 +11,10 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; @Service @RequiredArgsConstructor @@ -20,8 +23,8 @@ public class AddressService { private final GetAddress getAddress; public BaseResponse searchAddress(SearchAddressRequest searchAddressRequest) { - List
searchedAddresses = getAddress.searchAddressByPath(searchAddressRequest.searchAddress()); + List
searchedAddresses = getAddressByQuery(searchAddressRequest.searchAddress().trim()); if(searchedAddresses.isEmpty()) { throw new AddressException(BaseResponseStatus.NO_RESULT, BaseResponseMessage.일치하는_관할서_정보가_없습니다.getMessage()); } @@ -32,4 +35,19 @@ public BaseResponse searchAddress(SearchAddressRequest se SearchAddressResponse.from(searchedAddresses) ); } + + private List
getAddressByQuery(String officeName) { + List
searchedAddressesByOfficeName = getAddress.searchAddressByOfficeName(officeName); + List
searchedAddressesByRoadAddress = getAddress.searchAddressByRoadAddress(officeName); + + return Stream.concat(searchedAddressesByOfficeName.stream(), searchedAddressesByRoadAddress.stream()) + .collect(Collectors.toMap( + Address::getAddressId, + address -> address, + (existing, replacement) -> existing + )) + .values() + .stream() + .toList(); + } } diff --git a/src/main/java/com/neighbors/tohero/domain/domain/address/service/GetAddress.java b/src/main/java/com/neighbors/tohero/domain/domain/address/service/GetAddress.java index 751d2ed..3bef3a3 100644 --- a/src/main/java/com/neighbors/tohero/domain/domain/address/service/GetAddress.java +++ b/src/main/java/com/neighbors/tohero/domain/domain/address/service/GetAddress.java @@ -13,7 +13,11 @@ public class GetAddress { private final AddressRepository addressRepository; - public List
searchAddressByPath(String queryPath){ - return addressRepository.searchAddressByPath(queryPath); + public List
searchAddressByOfficeName(String queryPath){ + return addressRepository.searchAddressByOfficeName(queryPath); + } + + public List
searchAddressByRoadAddress(String queryRoadAddress){ + return addressRepository.searchAddressByRoadAddress(queryRoadAddress); } } diff --git a/src/main/java/com/neighbors/tohero/domain/query/AddressRepository.java b/src/main/java/com/neighbors/tohero/domain/query/AddressRepository.java index ab166f1..d7df8f0 100644 --- a/src/main/java/com/neighbors/tohero/domain/query/AddressRepository.java +++ b/src/main/java/com/neighbors/tohero/domain/query/AddressRepository.java @@ -5,6 +5,6 @@ import java.util.List; public interface AddressRepository { - List
searchAddressByPath(String queryPath); + List
searchAddressByOfficeName(String queryPath); List
searchAddressByRoadAddress(String queryRoadAddress); } diff --git a/src/main/java/com/neighbors/tohero/infrastructure/query/impl/AddressRepositoryImpl.java b/src/main/java/com/neighbors/tohero/infrastructure/query/impl/AddressRepositoryImpl.java index a7ad8bf..49fa0e5 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/query/impl/AddressRepositoryImpl.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/query/impl/AddressRepositoryImpl.java @@ -18,8 +18,8 @@ public class AddressRepositoryImpl implements AddressRepository { private final AddressMapper addressMapper; @Override - public List
searchAddressByPath(String queryPath) { - List addressEntities = addressEntityRepository.findAllContainsPath(queryPath); + public List
searchAddressByOfficeName(String queryPath) { + List addressEntities = addressEntityRepository.findAllContainsOfficeName(queryPath); return addressEntities.stream() .map(addressMapper::toDomain) diff --git a/src/main/java/com/neighbors/tohero/infrastructure/repository/AddressEntityRepository.java b/src/main/java/com/neighbors/tohero/infrastructure/repository/AddressEntityRepository.java index 208df77..9a7c2e7 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/repository/AddressEntityRepository.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/repository/AddressEntityRepository.java @@ -10,7 +10,7 @@ public interface AddressEntityRepository extends JpaRepository { @Query("SELECT a FROM AddressEntity a WHERE a.queryPath LIKE %:queryPath%") - List findAllContainsPath(@Param("queryPath") String queryPath); + List findAllContainsOfficeName(@Param("queryPath") String queryPath); @Query("SELECT a FROM AddressEntity a WHERE a.roadAddress LIKE %:queryRoadAddress%") List findAllContainsRoadAddress(@Param("queryRoadAddress") String queryRoadAddress); From 801de9280618b52e7fb7f24e5a9ffdf5787912fd Mon Sep 17 00:00:00 2001 From: imscow11253 Date: Tue, 7 Jan 2025 15:21:26 +0900 Subject: [PATCH 7/8] =?UTF-8?q?feat=20:=20=EA=B4=80=ED=95=A0=EC=84=9C=20?= =?UTF-8?q?=EC=A3=BC=EC=86=8C=20=EA=B2=80=EC=83=89=20API=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=ED=83=80=EC=BC=93=20=EC=A7=81=EC=97=85=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=20=EB=B0=9B=EB=8F=84=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../address/dto/SearchAddressRequest.java | 7 ++++++- .../address/service/AddressService.java | 9 +++++---- .../neighbors/tohero/common/enums/TargetJob.java | 8 ++++++++ .../domain/domain/address/service/GetAddress.java | 9 +++++---- .../tohero/domain/query/AddressRepository.java | 5 +++-- .../infrastructure/entity/AddressEntity.java | 5 +++++ .../query/impl/AddressRepositoryImpl.java | 9 +++++---- .../repository/AddressEntityRepository.java | 15 +++++++++++---- 8 files changed, 48 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/neighbors/tohero/common/enums/TargetJob.java diff --git a/src/main/java/com/neighbors/tohero/application/address/dto/SearchAddressRequest.java b/src/main/java/com/neighbors/tohero/application/address/dto/SearchAddressRequest.java index 0a581b4..ebff93f 100644 --- a/src/main/java/com/neighbors/tohero/application/address/dto/SearchAddressRequest.java +++ b/src/main/java/com/neighbors/tohero/application/address/dto/SearchAddressRequest.java @@ -1,11 +1,16 @@ package com.neighbors.tohero.application.address.dto; +import com.neighbors.tohero.common.enums.TargetJob; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import org.hibernate.validator.constraints.Length; public record SearchAddressRequest ( @Length(min = 1, max = 50) @NotBlank - String searchAddress + String searchAddress, + + @NotNull + TargetJob targetJob ){ } diff --git a/src/main/java/com/neighbors/tohero/application/address/service/AddressService.java b/src/main/java/com/neighbors/tohero/application/address/service/AddressService.java index 4824fbb..9f6db17 100644 --- a/src/main/java/com/neighbors/tohero/application/address/service/AddressService.java +++ b/src/main/java/com/neighbors/tohero/application/address/service/AddressService.java @@ -5,6 +5,7 @@ import com.neighbors.tohero.application.baseResponse.BaseResponse; import com.neighbors.tohero.application.baseResponse.BaseResponseMessage; import com.neighbors.tohero.application.baseResponse.BaseResponseStatus; +import com.neighbors.tohero.common.enums.TargetJob; import com.neighbors.tohero.common.exception.address.AddressException; import com.neighbors.tohero.domain.domain.address.model.Address; import com.neighbors.tohero.domain.domain.address.service.GetAddress; @@ -24,7 +25,7 @@ public class AddressService { public BaseResponse searchAddress(SearchAddressRequest searchAddressRequest) { - List
searchedAddresses = getAddressByQuery(searchAddressRequest.searchAddress().trim()); + List
searchedAddresses = getAddressByQuery(searchAddressRequest.searchAddress().trim(), searchAddressRequest.targetJob()); if(searchedAddresses.isEmpty()) { throw new AddressException(BaseResponseStatus.NO_RESULT, BaseResponseMessage.일치하는_관할서_정보가_없습니다.getMessage()); } @@ -36,9 +37,9 @@ public BaseResponse searchAddress(SearchAddressRequest se ); } - private List
getAddressByQuery(String officeName) { - List
searchedAddressesByOfficeName = getAddress.searchAddressByOfficeName(officeName); - List
searchedAddressesByRoadAddress = getAddress.searchAddressByRoadAddress(officeName); + private List
getAddressByQuery(String officeName, TargetJob targetJob) { + List
searchedAddressesByOfficeName = getAddress.searchAddressByOfficeName(officeName, targetJob); + List
searchedAddressesByRoadAddress = getAddress.searchAddressByRoadAddress(officeName, targetJob); return Stream.concat(searchedAddressesByOfficeName.stream(), searchedAddressesByRoadAddress.stream()) .collect(Collectors.toMap( diff --git a/src/main/java/com/neighbors/tohero/common/enums/TargetJob.java b/src/main/java/com/neighbors/tohero/common/enums/TargetJob.java new file mode 100644 index 0000000..eb6073b --- /dev/null +++ b/src/main/java/com/neighbors/tohero/common/enums/TargetJob.java @@ -0,0 +1,8 @@ +package com.neighbors.tohero.common.enums; + +import lombok.Getter; + +@Getter +public enum TargetJob { + POLICE_OFFICER, FIRE_FIGHTER +} diff --git a/src/main/java/com/neighbors/tohero/domain/domain/address/service/GetAddress.java b/src/main/java/com/neighbors/tohero/domain/domain/address/service/GetAddress.java index 3bef3a3..814afad 100644 --- a/src/main/java/com/neighbors/tohero/domain/domain/address/service/GetAddress.java +++ b/src/main/java/com/neighbors/tohero/domain/domain/address/service/GetAddress.java @@ -1,6 +1,7 @@ package com.neighbors.tohero.domain.domain.address.service; import com.neighbors.tohero.common.annotaion.DomainService; +import com.neighbors.tohero.common.enums.TargetJob; import com.neighbors.tohero.domain.domain.address.model.Address; import com.neighbors.tohero.domain.query.AddressRepository; import lombok.RequiredArgsConstructor; @@ -13,11 +14,11 @@ public class GetAddress { private final AddressRepository addressRepository; - public List
searchAddressByOfficeName(String queryPath){ - return addressRepository.searchAddressByOfficeName(queryPath); + public List
searchAddressByOfficeName(String queryPath, TargetJob targetJob){ + return addressRepository.searchAddressByOfficeName(queryPath, targetJob); } - public List
searchAddressByRoadAddress(String queryRoadAddress){ - return addressRepository.searchAddressByRoadAddress(queryRoadAddress); + public List
searchAddressByRoadAddress(String queryRoadAddress, TargetJob targetJob){ + return addressRepository.searchAddressByRoadAddress(queryRoadAddress, targetJob); } } diff --git a/src/main/java/com/neighbors/tohero/domain/query/AddressRepository.java b/src/main/java/com/neighbors/tohero/domain/query/AddressRepository.java index d7df8f0..a8291db 100644 --- a/src/main/java/com/neighbors/tohero/domain/query/AddressRepository.java +++ b/src/main/java/com/neighbors/tohero/domain/query/AddressRepository.java @@ -1,10 +1,11 @@ package com.neighbors.tohero.domain.query; +import com.neighbors.tohero.common.enums.TargetJob; import com.neighbors.tohero.domain.domain.address.model.Address; import java.util.List; public interface AddressRepository { - List
searchAddressByOfficeName(String queryPath); - List
searchAddressByRoadAddress(String queryRoadAddress); + List
searchAddressByOfficeName(String queryPath, TargetJob targetJob); + List
searchAddressByRoadAddress(String queryRoadAddress, TargetJob targetJob); } diff --git a/src/main/java/com/neighbors/tohero/infrastructure/entity/AddressEntity.java b/src/main/java/com/neighbors/tohero/infrastructure/entity/AddressEntity.java index 6105d4f..e8ab6ae 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/entity/AddressEntity.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/entity/AddressEntity.java @@ -1,5 +1,6 @@ package com.neighbors.tohero.infrastructure.entity; +import com.neighbors.tohero.common.enums.TargetJob; import com.neighbors.tohero.infrastructure.entity.base.BaseEntity; import jakarta.persistence.*; import lombok.Getter; @@ -24,4 +25,8 @@ public class AddressEntity extends BaseEntity { @Column(name = "query_path") private String queryPath; + + @Column(name = "target_job") + @Enumerated(value = EnumType.ORDINAL) + private TargetJob targetJob; } diff --git a/src/main/java/com/neighbors/tohero/infrastructure/query/impl/AddressRepositoryImpl.java b/src/main/java/com/neighbors/tohero/infrastructure/query/impl/AddressRepositoryImpl.java index 49fa0e5..b42719a 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/query/impl/AddressRepositoryImpl.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/query/impl/AddressRepositoryImpl.java @@ -1,5 +1,6 @@ package com.neighbors.tohero.infrastructure.query.impl; +import com.neighbors.tohero.common.enums.TargetJob; import com.neighbors.tohero.domain.domain.address.model.Address; import com.neighbors.tohero.domain.query.AddressRepository; import com.neighbors.tohero.infrastructure.entity.AddressEntity; @@ -18,8 +19,8 @@ public class AddressRepositoryImpl implements AddressRepository { private final AddressMapper addressMapper; @Override - public List
searchAddressByOfficeName(String queryPath) { - List addressEntities = addressEntityRepository.findAllContainsOfficeName(queryPath); + public List
searchAddressByOfficeName(String queryPath, TargetJob targetJob) { + List addressEntities = addressEntityRepository.findAllContainsOfficeName(queryPath,targetJob); return addressEntities.stream() .map(addressMapper::toDomain) @@ -27,8 +28,8 @@ public List
searchAddressByOfficeName(String queryPath) { } @Override - public List
searchAddressByRoadAddress(String queryRoadAddress) { - List addressEntities = addressEntityRepository.findAllContainsRoadAddress(queryRoadAddress); + public List
searchAddressByRoadAddress(String queryRoadAddress, TargetJob targetJob) { + List addressEntities = addressEntityRepository.findAllContainsRoadAddress(queryRoadAddress,targetJob); return addressEntities.stream() .map(addressMapper::toDomain) diff --git a/src/main/java/com/neighbors/tohero/infrastructure/repository/AddressEntityRepository.java b/src/main/java/com/neighbors/tohero/infrastructure/repository/AddressEntityRepository.java index 9a7c2e7..74c0d99 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/repository/AddressEntityRepository.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/repository/AddressEntityRepository.java @@ -1,5 +1,6 @@ package com.neighbors.tohero.infrastructure.repository; +import com.neighbors.tohero.common.enums.TargetJob; import com.neighbors.tohero.infrastructure.entity.AddressEntity; import io.lettuce.core.dynamic.annotation.Param; import org.springframework.data.jpa.repository.JpaRepository; @@ -9,9 +10,15 @@ public interface AddressEntityRepository extends JpaRepository { - @Query("SELECT a FROM AddressEntity a WHERE a.queryPath LIKE %:queryPath%") - List findAllContainsOfficeName(@Param("queryPath") String queryPath); + @Query("SELECT a FROM AddressEntity a WHERE a.queryPath LIKE %:queryPath% AND a.targetJob = :targetJob") + List findAllContainsOfficeName( + @Param("queryPath") String queryPath, + @Param("targetJob") TargetJob targetJob + ); - @Query("SELECT a FROM AddressEntity a WHERE a.roadAddress LIKE %:queryRoadAddress%") - List findAllContainsRoadAddress(@Param("queryRoadAddress") String queryRoadAddress); + @Query("SELECT a FROM AddressEntity a WHERE a.roadAddress LIKE %:queryRoadAddress% AND a.targetJob = :targetJob") + List findAllContainsRoadAddress( + @Param("queryRoadAddress") String queryRoadAddress, + @Param("targetJob") TargetJob targetJob + ); } From 5f34a09a75afe949a60869cc4dfc4e51223f3a7b Mon Sep 17 00:00:00 2001 From: imscow11253 Date: Tue, 7 Jan 2025 15:29:49 +0900 Subject: [PATCH 8/8] =?UTF-8?q?hotfix(presentation)=20:=20DTO=EC=97=90=20v?= =?UTF-8?q?alidated=20=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=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 --- .../tohero/presentation/controller/AddressController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/neighbors/tohero/presentation/controller/AddressController.java b/src/main/java/com/neighbors/tohero/presentation/controller/AddressController.java index aa04dae..64bca9f 100644 --- a/src/main/java/com/neighbors/tohero/presentation/controller/AddressController.java +++ b/src/main/java/com/neighbors/tohero/presentation/controller/AddressController.java @@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor; import org.springdoc.core.annotations.ParameterObject; import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -18,7 +19,7 @@ public class AddressController { private final AddressService addressService; @GetMapping("/address") - public ResponseEntity searchAddress(@ParameterObject SearchAddressRequest searchAddressRequest) { + public ResponseEntity searchAddress(@ParameterObject @Validated SearchAddressRequest searchAddressRequest) { return ResponseEntity.ok() .body(addressService.searchAddress(searchAddressRequest)); }