From 988a3d83e733736a37fc5ef2099e18d306153c9c Mon Sep 17 00:00:00 2001 From: DongUk <68818952+Kim0914@users.noreply.github.com> Date: Thu, 28 Dec 2023 16:48:41 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EC=82=AC=EC=A0=84=20=EC=8B=9D?= =?UTF-8?q?=EB=AC=BC=20=ED=95=84=EB=93=9C=20VO=20=EB=9E=98=ED=95=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../official/pium/domain/DictionaryPlant.java | 95 +++++------------ .../official/pium/domain/vo/CareDetail.java | 46 ++++++++ .../pium/domain/vo/Classification.java | 26 +++++ .../com/official/pium/domain/vo/Property.java | 34 ++++++ .../official/pium/domain/vo/Temperature.java | 26 +++++ .../pium/mapper/DictionaryPlantMapper.java | 75 ------------- .../official/pium/mapper/GardenMapper.java | 3 +- .../official/pium/mapper/PetPlantMapper.java | 8 +- .../repository/DictionaryPlantRepository.java | 2 +- .../pium/service/DictionaryPlantService.java | 28 ++--- .../dto/DictionaryPlantCreateRequest.java | 67 ++++++++++++ .../service/dto/DictionaryPlantResponse.java | 28 ++++- .../dto/DictionaryPlantSearchResponse.java | 19 +++- .../dto/DictionaryPlantUpdateRequest.java | 57 ++++++++++ .../resources/templates/admin/dict/plant.html | 60 ++++++----- .../templates/admin/dict/update.html | 56 ++++++---- .../acceptance/DictionaryPlantApiTest.java | 32 +++--- .../pium/fixture/DictionaryPlantFixture.java | 100 +++++++++++------- .../repository/HistoryRepositoryTest.java | 52 +++++---- .../service/DictionaryPlantServiceTest.java | 43 +++++--- .../pium/support/DictionaryPlantSupport.java | 52 +++++---- 21 files changed, 576 insertions(+), 333 deletions(-) create mode 100644 backend/pium/src/main/java/com/official/pium/domain/vo/CareDetail.java create mode 100644 backend/pium/src/main/java/com/official/pium/domain/vo/Classification.java create mode 100644 backend/pium/src/main/java/com/official/pium/domain/vo/Property.java create mode 100644 backend/pium/src/main/java/com/official/pium/domain/vo/Temperature.java delete mode 100644 backend/pium/src/main/java/com/official/pium/mapper/DictionaryPlantMapper.java diff --git a/backend/pium/src/main/java/com/official/pium/domain/DictionaryPlant.java b/backend/pium/src/main/java/com/official/pium/domain/DictionaryPlant.java index af1720583..d96fbbe20 100644 --- a/backend/pium/src/main/java/com/official/pium/domain/DictionaryPlant.java +++ b/backend/pium/src/main/java/com/official/pium/domain/DictionaryPlant.java @@ -1,5 +1,8 @@ package com.official.pium.domain; +import com.official.pium.domain.vo.CareDetail; +import com.official.pium.domain.vo.Classification; +import com.official.pium.domain.vo.Property; import jakarta.persistence.Column; import jakarta.persistence.Embedded; import jakarta.persistence.Entity; @@ -24,87 +27,41 @@ public class DictionaryPlant extends BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Column(name = "name") - private String name; - @Column(name = "image_url") private String imageUrl; - @Column(name = "family_name") - private String familyName; - - @Column(name = "smell") - private String smell; - - @Column(name = "poison") - private String poison; - - @Column(name = "manage_level") - private String manageLevel; - - @Column(name = "grow_speed") - private String growSpeed; - - @Column(name = "require_temp") - private String requireTemp; - - @Column(name = "minimum_temp") - private String minimumTemp; - - @Column(name = "require_humidity") - private String requireHumidity; - - @Column(name = "posting_place") - private String postingPlace; + @Embedded + private Classification classification; - @Column(name = "special_manage_info") - private String specialManageInfo; + @Embedded + private Property property; @Embedded - private WaterCycle waterCycle; + private CareDetail careDetail; @Builder - private DictionaryPlant(String name, String imageUrl, String familyName, String smell, String poison, - String manageLevel, String growSpeed, String requireTemp, String minimumTemp, - String requireHumidity, String postingPlace, String specialManageInfo, - WaterCycle waterCycle) { - this.name = name; + public DictionaryPlant( + String imageUrl, + Classification classification, + Property property, + CareDetail careDetail + ) { this.imageUrl = imageUrl; - this.familyName = familyName; - this.smell = smell; - this.poison = poison; - this.manageLevel = manageLevel; - this.growSpeed = growSpeed; - this.requireTemp = requireTemp; - this.minimumTemp = minimumTemp; - this.requireHumidity = requireHumidity; - this.postingPlace = postingPlace; - this.specialManageInfo = specialManageInfo; - this.waterCycle = waterCycle; + this.classification = classification; + this.property = property; + this.careDetail = careDetail; } - public void updateDictionaryPlant(String name, String imageUrl, String familyName, String smell, String poison, - String manageLevel, String growSpeed, String requireTemp, String minimumTemp, - String requireHumidity, String postingPlace, String specialManageInfo, - String spring, String summer, String autumn, String winter) { - this.name = name; + public void updateDictionaryPlant( + String imageUrl, + Classification classification, + Property property, + CareDetail careDetail + ) { this.imageUrl = imageUrl; - this.familyName = familyName; - this.smell = smell; - this.poison = poison; - this.manageLevel = manageLevel; - this.growSpeed = growSpeed; - this.requireTemp = requireTemp; - this.minimumTemp = minimumTemp; - this.requireHumidity = requireHumidity; - this.postingPlace = postingPlace; - this.specialManageInfo = specialManageInfo; - this.waterCycle = WaterCycle.builder() - .spring(spring) - .summer(summer) - .autumn(autumn) - .winter(winter) - .build(); + this.classification = classification; + this.property = property; + this.careDetail = careDetail; } @Override diff --git a/backend/pium/src/main/java/com/official/pium/domain/vo/CareDetail.java b/backend/pium/src/main/java/com/official/pium/domain/vo/CareDetail.java new file mode 100644 index 000000000..6c005b03d --- /dev/null +++ b/backend/pium/src/main/java/com/official/pium/domain/vo/CareDetail.java @@ -0,0 +1,46 @@ +package com.official.pium.domain.vo; + +import com.official.pium.domain.WaterCycle; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import jakarta.persistence.Embedded; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Embeddable +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class CareDetail { + + @Embedded + private Temperature temperature; + + @Column(name = "require_humidity") + private String requireHumidity; + + @Column(name = "posting_place") + private String postingPlace; + + @Column(name = "special_manage_info") + private String specialManageInfo; + + @Embedded + private WaterCycle waterCycle; + + @Builder + public CareDetail( + Temperature temperature, + String requireHumidity, + String postingPlace, + String specialManageInfo, + WaterCycle waterCycle + ) { + this.temperature = temperature; + this.requireHumidity = requireHumidity; + this.postingPlace = postingPlace; + this.specialManageInfo = specialManageInfo; + this.waterCycle = waterCycle; + } +} diff --git a/backend/pium/src/main/java/com/official/pium/domain/vo/Classification.java b/backend/pium/src/main/java/com/official/pium/domain/vo/Classification.java new file mode 100644 index 000000000..f4fa40e46 --- /dev/null +++ b/backend/pium/src/main/java/com/official/pium/domain/vo/Classification.java @@ -0,0 +1,26 @@ +package com.official.pium.domain.vo; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Embeddable +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Classification { + + @Column(name = "name") + private String name; + + @Column(name = "family_name") + private String familyName; + + @Builder + public Classification(String name, String familyName) { + this.name = name; + this.familyName = familyName; + } +} diff --git a/backend/pium/src/main/java/com/official/pium/domain/vo/Property.java b/backend/pium/src/main/java/com/official/pium/domain/vo/Property.java new file mode 100644 index 000000000..0e5245f43 --- /dev/null +++ b/backend/pium/src/main/java/com/official/pium/domain/vo/Property.java @@ -0,0 +1,34 @@ +package com.official.pium.domain.vo; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Embeddable +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Property { + + @Column(name = "smell") + private String smell; + + @Column(name = "poison") + private String poison; + + @Column(name = "manage_level") + private String manageLevel; + + @Column(name = "grow_speed") + private String growSpeed; + + @Builder + public Property(String smell, String poison, String manageLevel, String growSpeed) { + this.smell = smell; + this.poison = poison; + this.manageLevel = manageLevel; + this.growSpeed = growSpeed; + } +} diff --git a/backend/pium/src/main/java/com/official/pium/domain/vo/Temperature.java b/backend/pium/src/main/java/com/official/pium/domain/vo/Temperature.java new file mode 100644 index 000000000..30923aeb3 --- /dev/null +++ b/backend/pium/src/main/java/com/official/pium/domain/vo/Temperature.java @@ -0,0 +1,26 @@ +package com.official.pium.domain.vo; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Embeddable +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Temperature { + + @Column(name = "require_temp") + private String requireTemp; + + @Column(name = "minimum_temp") + private String minimumTemp; + + @Builder + public Temperature(String requireTemp, String minimumTemp) { + this.requireTemp = requireTemp; + this.minimumTemp = minimumTemp; + } +} diff --git a/backend/pium/src/main/java/com/official/pium/mapper/DictionaryPlantMapper.java b/backend/pium/src/main/java/com/official/pium/mapper/DictionaryPlantMapper.java deleted file mode 100644 index 0841f77e9..000000000 --- a/backend/pium/src/main/java/com/official/pium/mapper/DictionaryPlantMapper.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.official.pium.mapper; - -import com.official.pium.domain.DictionaryPlant; -import com.official.pium.domain.WaterCycle; -import com.official.pium.service.dto.DictionaryPlantCreateRequest; -import com.official.pium.service.dto.DictionaryPlantResponse; -import com.official.pium.service.dto.DictionaryPlantResponse.WaterCycleResponse; -import com.official.pium.service.dto.DictionaryPlantSearchResponse; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class DictionaryPlantMapper { - - public static DictionaryPlantResponse toDictionaryPlantResponse(DictionaryPlant dictionaryPlant) { - return DictionaryPlantResponse.builder() - .id(dictionaryPlant.getId()) - .name(dictionaryPlant.getName()) - .image(dictionaryPlant.getImageUrl()) - .familyName(dictionaryPlant.getFamilyName()) - .smell(dictionaryPlant.getSmell()) - .poison(dictionaryPlant.getPoison()) - .manageLevel(dictionaryPlant.getManageLevel()) - .growSpeed(dictionaryPlant.getGrowSpeed()) - .requireTemp(dictionaryPlant.getRequireTemp()) - .minimumTemp(dictionaryPlant.getMinimumTemp()) - .requireHumidity(dictionaryPlant.getRequireHumidity()) - .postingPlace(dictionaryPlant.getPostingPlace()) - .specialManageInfo(dictionaryPlant.getSpecialManageInfo()) - .waterCycle(toWaterCycleResponse(dictionaryPlant.getWaterCycle())) - .build(); - } - - private static WaterCycleResponse toWaterCycleResponse(WaterCycle waterCycle) { - return WaterCycleResponse.builder() - .spring(waterCycle.getSpring()) - .summer(waterCycle.getSummer()) - .autumn(waterCycle.getAutumn()) - .winter(waterCycle.getWinter()) - .build(); - } - - public static DictionaryPlantSearchResponse toDictionaryPlantSearchResponse(DictionaryPlant dictionaryPlant) { - return DictionaryPlantSearchResponse.builder() - .id(dictionaryPlant.getId()) - .name(dictionaryPlant.getName()) - .image(dictionaryPlant.getImageUrl()) - .build(); - } - - public static DictionaryPlant toDictionaryPlant(DictionaryPlantCreateRequest createRequest) { - return DictionaryPlant.builder() - .name(createRequest.getName()) - .imageUrl(createRequest.getImageUrl()) - .familyName(createRequest.getFamilyName()) - .smell(createRequest.getSmell()) - .poison(createRequest.getPoison()) - .manageLevel(createRequest.getManageLevel()) - .growSpeed(createRequest.getGrowSpeed()) - .requireTemp(createRequest.getRequireTemp()) - .minimumTemp(createRequest.getMinimumTemp()) - .requireHumidity(createRequest.getRequireHumidity()) - .postingPlace(createRequest.getPostingPlace()) - .specialManageInfo(createRequest.getSpecialManageInfo()) - .waterCycle( - WaterCycle.builder() - .spring(createRequest.getSpring()) - .summer(createRequest.getSummer()) - .autumn(createRequest.getAutumn()) - .winter(createRequest.getWinter()) - .build() - ) - .build(); - } -} diff --git a/backend/pium/src/main/java/com/official/pium/mapper/GardenMapper.java b/backend/pium/src/main/java/com/official/pium/mapper/GardenMapper.java index fdd7b6aec..b31936699 100644 --- a/backend/pium/src/main/java/com/official/pium/mapper/GardenMapper.java +++ b/backend/pium/src/main/java/com/official/pium/mapper/GardenMapper.java @@ -48,7 +48,8 @@ private static SingleGardenResponse toSingleGardenResponse(Garden garden) { .id(garden.getId()) .createdAt(garden.getCreatedAt()) .updatedAt(garden.getUpdatedAt()) - .dictionaryPlantName(garden.getDictionaryPlant().getName()) + .dictionaryPlantName(garden.getDictionaryPlant().getClassification() + .getName()) .content(garden.getContent()) .manageLevel(garden.getManageLevel()) .petPlant(toPetPlantInfo(garden)) diff --git a/backend/pium/src/main/java/com/official/pium/mapper/PetPlantMapper.java b/backend/pium/src/main/java/com/official/pium/mapper/PetPlantMapper.java index 05342a2cb..497834791 100644 --- a/backend/pium/src/main/java/com/official/pium/mapper/PetPlantMapper.java +++ b/backend/pium/src/main/java/com/official/pium/mapper/PetPlantMapper.java @@ -55,7 +55,7 @@ public static PetPlantResponse toPetPlantResponse(PetPlant petPlant, Long dday, .daySince(daySince) .dictionaryPlant(PetPlantResponse.DictionaryPlantResponse.builder() .id(dictionaryPlant.getId()) - .name(dictionaryPlant.getName()) + .name(dictionaryPlant.getClassification().getName()) .build() ) .build(); @@ -80,7 +80,7 @@ public static PetPlantResponse toPetPlantResponse(PetPlant petPlant, Long dday, .daySince(daySince) .dictionaryPlant(PetPlantResponse.DictionaryPlantResponse.builder() .id(dictionaryPlant.getId()) - .name(dictionaryPlant.getName()) + .name(dictionaryPlant.getClassification().getName()) .build() ) .secondLastWaterDate(secondLastWaterDate) @@ -92,7 +92,7 @@ public static SinglePetPlantResponse toSinglePetPlantResponse(PetPlant petPlant, .id(petPlant.getId()) .nickname(petPlant.getNickname()) .imageUrl(petPlant.getImageUrl()) - .dictionaryPlantName(petPlant.getDictionaryPlant().getName()) + .dictionaryPlantName(petPlant.getDictionaryPlant().getClassification().getName()) .birthDate(petPlant.getBirthDate()) .daySince(daySince) .build(); @@ -103,7 +103,7 @@ public static ReminderResponse toReminderResponse(PetPlant petPlant, Long dday) .petPlantId(petPlant.getId()) .image(petPlant.getImageUrl()) .nickName(petPlant.getNickname()) - .dictionaryPlantName(petPlant.getDictionaryPlant().getName()) + .dictionaryPlantName(petPlant.getDictionaryPlant().getClassification().getName()) .dday(dday) .nextWaterDate(petPlant.getNextWaterDate()) .lastWaterDate(petPlant.getLastWaterDate()) diff --git a/backend/pium/src/main/java/com/official/pium/repository/DictionaryPlantRepository.java b/backend/pium/src/main/java/com/official/pium/repository/DictionaryPlantRepository.java index c04d015cb..6814c64f9 100644 --- a/backend/pium/src/main/java/com/official/pium/repository/DictionaryPlantRepository.java +++ b/backend/pium/src/main/java/com/official/pium/repository/DictionaryPlantRepository.java @@ -6,5 +6,5 @@ public interface DictionaryPlantRepository extends JpaRepository { - List findDictionaryPlantsByNameContains(String name); + List findDictionaryPlantsByClassification_NameContains(String name); } diff --git a/backend/pium/src/main/java/com/official/pium/service/DictionaryPlantService.java b/backend/pium/src/main/java/com/official/pium/service/DictionaryPlantService.java index f18a8ef67..ec49dd18a 100644 --- a/backend/pium/src/main/java/com/official/pium/service/DictionaryPlantService.java +++ b/backend/pium/src/main/java/com/official/pium/service/DictionaryPlantService.java @@ -1,7 +1,6 @@ package com.official.pium.service; import com.official.pium.domain.DictionaryPlant; -import com.official.pium.mapper.DictionaryPlantMapper; import com.official.pium.repository.DictionaryPlantRepository; import com.official.pium.repository.PetPlantRepository; import com.official.pium.service.dto.DataResponse; @@ -27,14 +26,15 @@ public DictionaryPlantResponse read(Long id) { DictionaryPlant dictionaryPlant = dictionaryPlantRepository.findById(id) .orElseThrow(() -> new NoSuchElementException("사전 식물이 존재하지 않습니다. id: " + id)); - return DictionaryPlantMapper.toDictionaryPlantResponse(dictionaryPlant); + return DictionaryPlantResponse.from(dictionaryPlant); } public DataResponse> search(String name) { - List dictionaryPlants = dictionaryPlantRepository.findDictionaryPlantsByNameContains(name); + List dictionaryPlants = dictionaryPlantRepository.findDictionaryPlantsByClassification_NameContains( + name); List dictionaryPlantSearchResponses = dictionaryPlants.stream() - .map(DictionaryPlantMapper::toDictionaryPlantSearchResponse) + .map(DictionaryPlantSearchResponse::from) .toList(); return DataResponse.>builder() @@ -44,7 +44,7 @@ public DataResponse> search(String name) { @Transactional public Long create(DictionaryPlantCreateRequest request) { - DictionaryPlant dictionaryPlant = DictionaryPlantMapper.toDictionaryPlant(request); + DictionaryPlant dictionaryPlant = request.toDictionaryPlant(); dictionaryPlantRepository.save(dictionaryPlant); return dictionaryPlant.getId(); } @@ -55,22 +55,10 @@ public void update(Long id, DictionaryPlantUpdateRequest request) { .orElseThrow(() -> new NoSuchElementException("사전 식물이 존재하지 않습니다. id: " + id)); dictionaryPlant.updateDictionaryPlant( - request.getName(), request.getImageUrl(), - request.getFamilyName(), - request.getSmell(), - request.getPoison(), - request.getManageLevel(), - request.getGrowSpeed(), - request.getRequireTemp(), - request.getMinimumTemp(), - request.getRequireHumidity(), - request.getPostingPlace(), - request.getSpecialManageInfo(), - request.getSpring(), - request.getSummer(), - request.getAutumn(), - request.getWinter() + request.toClassification(), + request.toProperty(), + request.toCareDetail() ); } diff --git a/backend/pium/src/main/java/com/official/pium/service/dto/DictionaryPlantCreateRequest.java b/backend/pium/src/main/java/com/official/pium/service/dto/DictionaryPlantCreateRequest.java index 5009d1225..e4f604427 100644 --- a/backend/pium/src/main/java/com/official/pium/service/dto/DictionaryPlantCreateRequest.java +++ b/backend/pium/src/main/java/com/official/pium/service/dto/DictionaryPlantCreateRequest.java @@ -1,5 +1,11 @@ package com.official.pium.service.dto; +import com.official.pium.domain.DictionaryPlant; +import com.official.pium.domain.WaterCycle; +import com.official.pium.domain.vo.CareDetail; +import com.official.pium.domain.vo.Classification; +import com.official.pium.domain.vo.Property; +import com.official.pium.domain.vo.Temperature; import jakarta.validation.constraints.NotNull; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -60,4 +66,65 @@ public class DictionaryPlantCreateRequest { @NotNull(message = "winter은 비어있을 수 없습니다 winter: ${validatedValue}") private String winter; + + public DictionaryPlant toDictionaryPlant() { + return DictionaryPlant.builder() + .imageUrl(this.imageUrl) + .classification(toClassification()) + .property(toProperty()) + .careDetail(toCareDetail()) + .build(); + } + + private Classification toClassification() { + return Classification.builder() + .name(this.name) + .familyName(this.familyName) + .build(); + } + + private Property toProperty() { + return Property.builder() + .smell(this.smell) + .poison(this.poison) + .manageLevel(this.manageLevel) + .growSpeed(this.growSpeed) + .build(); + } + + private CareDetail toCareDetail() { + return CareDetail.builder() + .temperature( + toTemperature() + ) + .requireHumidity( + this.requireHumidity + ) + .postingPlace( + this.postingPlace + ) + .specialManageInfo( + this.specialManageInfo + ) + .waterCycle( + toWaterCycle() + ) + .build(); + } + + private WaterCycle toWaterCycle() { + return WaterCycle.builder() + .spring(this.spring) + .summer(this.summer) + .autumn(this.autumn) + .winter(this.winter) + .build(); + } + + private Temperature toTemperature() { + return Temperature.builder() + .minimumTemp(this.minimumTemp) + .requireTemp(this.requireTemp) + .build(); + } } diff --git a/backend/pium/src/main/java/com/official/pium/service/dto/DictionaryPlantResponse.java b/backend/pium/src/main/java/com/official/pium/service/dto/DictionaryPlantResponse.java index 03b196649..17e16f66a 100644 --- a/backend/pium/src/main/java/com/official/pium/service/dto/DictionaryPlantResponse.java +++ b/backend/pium/src/main/java/com/official/pium/service/dto/DictionaryPlantResponse.java @@ -1,5 +1,6 @@ package com.official.pium.service.dto; +import com.official.pium.domain.DictionaryPlant; import java.util.Arrays; import java.util.List; import lombok.AccessLevel; @@ -7,7 +8,6 @@ import lombok.Getter; import lombok.NoArgsConstructor; -import java.util.List; @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) public class DictionaryPlantResponse { @@ -48,6 +48,32 @@ private DictionaryPlantResponse(Long id, String name, String image, String famil this.waterCycle = waterCycle; } + public static DictionaryPlantResponse from(DictionaryPlant dictionaryPlant) { + return DictionaryPlantResponse.builder() + .id(dictionaryPlant.getId()) + .name(dictionaryPlant.getClassification().getName()) + .image(dictionaryPlant.getImageUrl()) + .familyName(dictionaryPlant.getClassification().getFamilyName()) + .smell(dictionaryPlant.getProperty().getSmell()) + .poison(dictionaryPlant.getProperty().getPoison()) + .manageLevel(dictionaryPlant.getProperty().getManageLevel()) + .growSpeed(dictionaryPlant.getProperty().getGrowSpeed()) + .requireTemp(dictionaryPlant.getCareDetail().getTemperature().getRequireTemp()) + .minimumTemp(dictionaryPlant.getCareDetail().getTemperature().getMinimumTemp()) + .requireHumidity(dictionaryPlant.getCareDetail().getRequireHumidity()) + .postingPlace(dictionaryPlant.getCareDetail().getPostingPlace()) + .specialManageInfo(dictionaryPlant.getCareDetail().getSpecialManageInfo()) + .waterCycle( + WaterCycleResponse.builder() + .spring(dictionaryPlant.getCareDetail().getWaterCycle().getSpring()) + .summer(dictionaryPlant.getCareDetail().getWaterCycle().getSummer()) + .autumn(dictionaryPlant.getCareDetail().getWaterCycle().getAutumn()) + .winter(dictionaryPlant.getCareDetail().getWaterCycle().getWinter()) + .build() + ) + .build(); + } + @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class WaterCycleResponse { diff --git a/backend/pium/src/main/java/com/official/pium/service/dto/DictionaryPlantSearchResponse.java b/backend/pium/src/main/java/com/official/pium/service/dto/DictionaryPlantSearchResponse.java index df89e851a..bfdb2895b 100644 --- a/backend/pium/src/main/java/com/official/pium/service/dto/DictionaryPlantSearchResponse.java +++ b/backend/pium/src/main/java/com/official/pium/service/dto/DictionaryPlantSearchResponse.java @@ -1,18 +1,31 @@ package com.official.pium.service.dto; +import com.official.pium.domain.DictionaryPlant; import lombok.AccessLevel; -import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @Getter -@Builder @NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor(access = AccessLevel.PRIVATE) public class DictionaryPlantSearchResponse { private Long id; private String name; private String image; + + @Builder + private DictionaryPlantSearchResponse(Long id, String name, String image) { + this.id = id; + this.name = name; + this.image = image; + } + + public static DictionaryPlantSearchResponse from(DictionaryPlant dictionaryPlant) { + return DictionaryPlantSearchResponse.builder() + .id(dictionaryPlant.getId()) + .name(dictionaryPlant.getClassification().getName()) + .image(dictionaryPlant.getImageUrl()) + .build(); + } } diff --git a/backend/pium/src/main/java/com/official/pium/service/dto/DictionaryPlantUpdateRequest.java b/backend/pium/src/main/java/com/official/pium/service/dto/DictionaryPlantUpdateRequest.java index de2d295e0..89bc48320 100644 --- a/backend/pium/src/main/java/com/official/pium/service/dto/DictionaryPlantUpdateRequest.java +++ b/backend/pium/src/main/java/com/official/pium/service/dto/DictionaryPlantUpdateRequest.java @@ -1,5 +1,10 @@ package com.official.pium.service.dto; +import com.official.pium.domain.WaterCycle; +import com.official.pium.domain.vo.CareDetail; +import com.official.pium.domain.vo.Classification; +import com.official.pium.domain.vo.Property; +import com.official.pium.domain.vo.Temperature; import jakarta.validation.constraints.NotNull; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -60,4 +65,56 @@ public class DictionaryPlantUpdateRequest { @NotNull private String winter; + + public Classification toClassification() { + return Classification.builder() + .name(this.name) + .familyName(this.familyName) + .build(); + } + + public Property toProperty() { + return Property.builder() + .smell(this.smell) + .poison(this.poison) + .manageLevel(this.manageLevel) + .growSpeed(this.growSpeed) + .build(); + } + + public CareDetail toCareDetail() { + return CareDetail.builder() + .temperature( + toTemperature() + ) + .requireHumidity( + this.requireHumidity + ) + .postingPlace( + this.postingPlace + ) + .specialManageInfo( + this.specialManageInfo + ) + .waterCycle( + toWaterCycle() + ) + .build(); + } + + private WaterCycle toWaterCycle() { + return WaterCycle.builder() + .spring(this.spring) + .summer(this.summer) + .autumn(this.autumn) + .winter(this.winter) + .build(); + } + + private Temperature toTemperature() { + return Temperature.builder() + .minimumTemp(this.minimumTemp) + .requireTemp(this.requireTemp) + .build(); + } } diff --git a/backend/pium/src/main/resources/templates/admin/dict/plant.html b/backend/pium/src/main/resources/templates/admin/dict/plant.html index 07d229111..99933a67d 100644 --- a/backend/pium/src/main/resources/templates/admin/dict/plant.html +++ b/backend/pium/src/main/resources/templates/admin/dict/plant.html @@ -8,15 +8,16 @@

사전 식물 상세정보

-

+

-
+
- +
@@ -26,83 +27,86 @@

-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/backend/pium/src/main/resources/templates/admin/dict/update.html b/backend/pium/src/main/resources/templates/admin/dict/update.html index 78cb9a436..4e384e640 100644 --- a/backend/pium/src/main/resources/templates/admin/dict/update.html +++ b/backend/pium/src/main/resources/templates/admin/dict/update.html @@ -8,17 +8,17 @@

사전 식물 수정

-

+

- +
-
+
@@ -30,85 +30,95 @@

- +
- +
- +
+ th:value="${plant.property.manageLevel}" th:field="${plant.property.manageLevel}">
- +
+ th:value="${plant.careDetail.temperature.requireTemp}" + th:field="${plant.careDetail.temperature.requireTemp}">
+ th:value="${plant.careDetail.temperature.minimumTemp}" + th:field="${plant.careDetail.temperature.minimumTemp}">
+ th:value="${plant.careDetail.requireHumidity}" th:field="${plant.careDetail.requireHumidity}">
+ th:value="${plant.careDetail.postingPlace}" th:field="${plant.careDetail.postingPlace}">
+ th:value="${plant.careDetail.specialManageInfo}" + th:field="${plant.careDetail.specialManageInfo}">
- +
- +
- +
- +
- +
diff --git a/backend/pium/src/test/java/com/official/pium/acceptance/DictionaryPlantApiTest.java b/backend/pium/src/test/java/com/official/pium/acceptance/DictionaryPlantApiTest.java index 8db7a286e..069d660ac 100644 --- a/backend/pium/src/test/java/com/official/pium/acceptance/DictionaryPlantApiTest.java +++ b/backend/pium/src/test/java/com/official/pium/acceptance/DictionaryPlantApiTest.java @@ -9,11 +9,7 @@ import io.restassured.RestAssured; import io.restassured.response.ExtractableResponse; import io.restassured.response.Response; - -import java.time.LocalDateTime; import java.util.List; - -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Nested; @@ -42,21 +38,27 @@ class 사전_식물_단건_조회 { assertSoftly(softly -> { softly.assertThat(response.jsonPath().getLong("id")).isEqualTo(request.getId()); - softly.assertThat(response.jsonPath().getString("name")).isEqualTo(request.getName()); + softly.assertThat(response.jsonPath().getString("name")) + .isEqualTo(request.getClassification().getName()); softly.assertThat(response.jsonPath().getString("image")).isEqualTo(request.getImageUrl()); - softly.assertThat(response.jsonPath().getString("familyName")).isEqualTo(request.getFamilyName()); - softly.assertThat(response.jsonPath().getString("smell")).isEqualTo(request.getSmell()); - softly.assertThat(response.jsonPath().getString("poison")).isEqualTo(request.getPoison()); - softly.assertThat(response.jsonPath().getString("manageLevel")).isEqualTo(request.getManageLevel()); - softly.assertThat(response.jsonPath().getString("growSpeed")).isEqualTo(request.getGrowSpeed()); - softly.assertThat(response.jsonPath().getString("requireTemp")).isEqualTo(request.getRequireTemp()); - softly.assertThat(response.jsonPath().getString("minimumTemp")).isEqualTo(request.getMinimumTemp()); + softly.assertThat(response.jsonPath().getString("familyName")) + .isEqualTo(request.getClassification().getFamilyName()); + softly.assertThat(response.jsonPath().getString("smell")).isEqualTo(request.getProperty().getSmell()); + softly.assertThat(response.jsonPath().getString("poison")).isEqualTo(request.getProperty().getPoison()); + softly.assertThat(response.jsonPath().getString("manageLevel")) + .isEqualTo(request.getProperty().getManageLevel()); + softly.assertThat(response.jsonPath().getString("growSpeed")) + .isEqualTo(request.getProperty().getGrowSpeed()); + softly.assertThat(response.jsonPath().getString("requireTemp")) + .isEqualTo(request.getCareDetail().getTemperature().getRequireTemp()); + softly.assertThat(response.jsonPath().getString("minimumTemp")) + .isEqualTo(request.getCareDetail().getTemperature().getMinimumTemp()); softly.assertThat(response.jsonPath().getString("requireHumidity")) - .isEqualTo(request.getRequireHumidity()); + .isEqualTo(request.getCareDetail().getRequireHumidity()); softly.assertThat(response.jsonPath().getList("postingPlace")) - .isEqualTo(List.of(request.getPostingPlace().split(","))); + .isEqualTo(List.of(request.getCareDetail().getPostingPlace().split(","))); softly.assertThat(response.jsonPath().getString("specialManageInfo")) - .isEqualTo(request.getSpecialManageInfo()); + .isEqualTo(request.getCareDetail().getSpecialManageInfo()); } ); } diff --git a/backend/pium/src/test/java/com/official/pium/fixture/DictionaryPlantFixture.java b/backend/pium/src/test/java/com/official/pium/fixture/DictionaryPlantFixture.java index 49e93a72b..07c454cfa 100644 --- a/backend/pium/src/test/java/com/official/pium/fixture/DictionaryPlantFixture.java +++ b/backend/pium/src/test/java/com/official/pium/fixture/DictionaryPlantFixture.java @@ -2,6 +2,10 @@ import com.official.pium.domain.DictionaryPlant; import com.official.pium.domain.WaterCycle; +import com.official.pium.domain.vo.CareDetail; +import com.official.pium.domain.vo.Classification; +import com.official.pium.domain.vo.Property; +import com.official.pium.domain.vo.Temperature; import com.official.pium.service.dto.DataResponse; import com.official.pium.service.dto.DictionaryPlantCreateRequest; import com.official.pium.service.dto.DictionaryPlantResponse; @@ -15,26 +19,36 @@ public class DictionaryPlantFixture { public static DictionaryPlant 스투키 = DictionaryPlant.builder() - .name("스투키") + .classification(Classification.builder() + .name("스투키") + .familyName("선인장") + .build()) .imageUrl("https://www.costco.co.kr/medias/sys_master/images/hd6/h37/31058517229598.jpg") - .familyName("선인장") - .smell("안남") - .poison("없음") - .manageLevel("어려움") - .growSpeed("빨리자람") - .requireTemp("20도") - .minimumTemp("0도") - .requireHumidity("15%") - .postingPlace("베란다 앞") - .specialManageInfo("물을 많이 주지않아도 됩니다.") - .waterCycle( - WaterCycle.builder() - .spring("겉흙이 마르면 촉촉하게") - .summer("겉흙이 마르면 촉촉하게") - .autumn("겉흙이 마르면 촉촉하게") - .winter("겉흙이 마르면 촉촉하게") - .build() - ).build(); + .property(Property.builder() + .smell("안남") + .poison("없음") + .manageLevel("어려움") + .growSpeed("빨리자람") + .build()) + .careDetail(CareDetail.builder() + .temperature(Temperature.builder() + .requireTemp("20도") + .minimumTemp("0도") + .build()) + .requireHumidity("15%") + .postingPlace("베란다 앞") + .specialManageInfo("물을 많이 주지않아도 됩니다.") + .waterCycle( + WaterCycle.builder() + .spring("겉흙이 마르면 촉촉하게") + .summer("겉흙이 마르면 촉촉하게") + .autumn("겉흙이 마르면 촉촉하게") + .winter("겉흙이 마르면 촉촉하게") + .build() + ) + .build() + ) + .build(); public static class REQUEST { @@ -131,25 +145,35 @@ public static class RESPONSE { public static DictionaryPlant generateDictionaryPlant() { return DictionaryPlant.builder() - .name("라벤다") + .classification(Classification.builder() + .name("라벤다") + .familyName("멋진 라벤더") + .build()) .imageUrl("https://www.costco.co.kr/medias/sys_master/images/hd6/h37/31058517229598.jpg") - .familyName("멋진 라벤더") - .smell("안남") - .poison("없음") - .manageLevel("쉬움") - .growSpeed("빨리자람") - .requireTemp("14도") - .minimumTemp("0도") - .requireHumidity("15%") - .postingPlace("베란다 앞") - .specialManageInfo("물을 많이 주지않아도 됩니다.") - .waterCycle( - WaterCycle.builder() - .spring("겉흙이 마르면 촉촉하게") - .summer("겉흙이 마르면 촉촉하게") - .autumn("겉흙이 마르면 촉촉하게") - .winter("겉흙이 마르면 촉촉하게") - .build() - ).build(); + .property(Property.builder() + .smell("안남") + .poison("없음") + .manageLevel("쉬움") + .growSpeed("빨리자람") + .build()) + .careDetail(CareDetail.builder() + .temperature(Temperature.builder() + .requireTemp("14도") + .minimumTemp("0도") + .build()) + .requireHumidity("15%") + .postingPlace("베란다 앞") + .specialManageInfo("물을 많이 주지않아도 됩니다.") + .waterCycle( + WaterCycle.builder() + .spring("겉흙이 마르면 촉촉하게") + .summer("겉흙이 마르면 촉촉하게") + .autumn("겉흙이 마르면 촉촉하게") + .winter("겉흙이 마르면 촉촉하게") + .build() + ) + .build() + ) + .build(); } } diff --git a/backend/pium/src/test/java/com/official/pium/repository/HistoryRepositoryTest.java b/backend/pium/src/test/java/com/official/pium/repository/HistoryRepositoryTest.java index b1d735ac9..d216d9e28 100644 --- a/backend/pium/src/test/java/com/official/pium/repository/HistoryRepositoryTest.java +++ b/backend/pium/src/test/java/com/official/pium/repository/HistoryRepositoryTest.java @@ -11,6 +11,10 @@ import com.official.pium.domain.Member; import com.official.pium.domain.PetPlant; import com.official.pium.domain.WaterCycle; +import com.official.pium.domain.vo.CareDetail; +import com.official.pium.domain.vo.Classification; +import com.official.pium.domain.vo.Property; +import com.official.pium.domain.vo.Temperature; import java.time.LocalDate; import java.util.List; import org.junit.jupiter.api.BeforeEach; @@ -168,26 +172,36 @@ private PetPlant savePetPlant(Member member, DictionaryPlant dictionaryPlant) { private DictionaryPlant saveDictionaryPlant() { DictionaryPlant dictionaryPlant = DictionaryPlant.builder() - .name("스투키") + .classification(Classification.builder() + .name("스투키") + .familyName("선인장") + .build()) .imageUrl("https://www.costco.co.kr/medias/sys_master/images/hd6/h37/31058517229598.jpg") - .familyName("선인장") - .smell("안남") - .poison("없음") - .manageLevel("어려움") - .growSpeed("빨리자람") - .requireTemp("20도") - .minimumTemp("0도") - .requireHumidity("15%") - .postingPlace("베란다 앞") - .specialManageInfo("물을 많이 주지않아도 됩니다.") - .waterCycle( - WaterCycle.builder() - .spring("겉흙이 마르면 촉촉하게") - .summer("겉흙이 마르면 촉촉하게") - .autumn("겉흙이 마르면 촉촉하게") - .winter("겉흙이 마르면 촉촉하게") - .build() - ).build(); + .property(Property.builder() + .smell("안남") + .poison("없음") + .manageLevel("어려움") + .growSpeed("빨리자람") + .build()) + .careDetail(CareDetail.builder() + .temperature(Temperature.builder() + .requireTemp("20도") + .minimumTemp("0도") + .build()) + .requireHumidity("15%") + .postingPlace("베란다 앞") + .specialManageInfo("물을 많이 주지않아도 됩니다.") + .waterCycle( + WaterCycle.builder() + .spring("겉흙이 마르면 촉촉하게") + .summer("겉흙이 마르면 촉촉하게") + .autumn("겉흙이 마르면 촉촉하게") + .winter("겉흙이 마르면 촉촉하게") + .build() + ) + .build() + ) + .build(); dictionaryPlantRepository.save(dictionaryPlant); return dictionaryPlant; } diff --git a/backend/pium/src/test/java/com/official/pium/service/DictionaryPlantServiceTest.java b/backend/pium/src/test/java/com/official/pium/service/DictionaryPlantServiceTest.java index 4db44acd4..ef58f4a02 100644 --- a/backend/pium/src/test/java/com/official/pium/service/DictionaryPlantServiceTest.java +++ b/backend/pium/src/test/java/com/official/pium/service/DictionaryPlantServiceTest.java @@ -7,7 +7,6 @@ import com.official.pium.IntegrationTest; import com.official.pium.domain.DictionaryPlant; import com.official.pium.fixture.DictionaryPlantFixture.REQUEST; -import com.official.pium.mapper.DictionaryPlantMapper; import com.official.pium.repository.DictionaryPlantRepository; import com.official.pium.service.dto.DataResponse; import com.official.pium.service.dto.DictionaryPlantResponse; @@ -35,7 +34,7 @@ class DictionaryPlantServiceTest extends IntegrationTest { DictionaryPlant dictionaryPlant = dictionaryPlantSupport.builder().build(); DictionaryPlantResponse actual = dictionaryPlantService.read(dictionaryPlant.getId()); - DictionaryPlantResponse expected = DictionaryPlantMapper.toDictionaryPlantResponse(dictionaryPlant); + DictionaryPlantResponse expected = DictionaryPlantResponse.from(dictionaryPlant); assertThat(actual) .usingRecursiveComparison() @@ -84,22 +83,32 @@ class DictionaryPlantServiceTest extends IntegrationTest { dictionaryPlantService.update(dictionaryPlantId, updateRequest); assertSoftly(softly -> { - softly.assertThat(dictionaryPlant.getName()).isEqualTo(updateRequest.getName()); + softly.assertThat(dictionaryPlant.getClassification().getName()).isEqualTo(updateRequest.getName()); softly.assertThat(dictionaryPlant.getImageUrl()).isEqualTo(updateRequest.getImageUrl()); - softly.assertThat(dictionaryPlant.getFamilyName()).isEqualTo(updateRequest.getFamilyName()); - softly.assertThat(dictionaryPlant.getSmell()).isEqualTo(updateRequest.getSmell()); - softly.assertThat(dictionaryPlant.getPoison()).isEqualTo(updateRequest.getPoison()); - softly.assertThat(dictionaryPlant.getManageLevel()).isEqualTo(updateRequest.getManageLevel()); - softly.assertThat(dictionaryPlant.getGrowSpeed()).isEqualTo(updateRequest.getGrowSpeed()); - softly.assertThat(dictionaryPlant.getRequireTemp()).isEqualTo(updateRequest.getRequireTemp()); - softly.assertThat(dictionaryPlant.getMinimumTemp()).isEqualTo(updateRequest.getMinimumTemp()); - softly.assertThat(dictionaryPlant.getRequireHumidity()).isEqualTo(updateRequest.getRequireHumidity()); - softly.assertThat(dictionaryPlant.getPostingPlace()).isEqualTo(updateRequest.getPostingPlace()); - softly.assertThat(dictionaryPlant.getSpecialManageInfo()).isEqualTo(updateRequest.getSpecialManageInfo()); - softly.assertThat(dictionaryPlant.getWaterCycle().getSpring()).isEqualTo(updateRequest.getSpring()); - softly.assertThat(dictionaryPlant.getWaterCycle().getSummer()).isEqualTo(updateRequest.getSummer()); - softly.assertThat(dictionaryPlant.getWaterCycle().getAutumn()).isEqualTo(updateRequest.getAutumn()); - softly.assertThat(dictionaryPlant.getWaterCycle().getWinter()).isEqualTo(updateRequest.getWinter()); + softly.assertThat(dictionaryPlant.getClassification().getFamilyName()) + .isEqualTo(updateRequest.getFamilyName()); + softly.assertThat(dictionaryPlant.getProperty().getSmell()).isEqualTo(updateRequest.getSmell()); + softly.assertThat(dictionaryPlant.getProperty().getPoison()).isEqualTo(updateRequest.getPoison()); + softly.assertThat(dictionaryPlant.getProperty().getManageLevel()).isEqualTo(updateRequest.getManageLevel()); + softly.assertThat(dictionaryPlant.getProperty().getGrowSpeed()).isEqualTo(updateRequest.getGrowSpeed()); + softly.assertThat(dictionaryPlant.getCareDetail().getTemperature().getRequireTemp()) + .isEqualTo(updateRequest.getRequireTemp()); + softly.assertThat(dictionaryPlant.getCareDetail().getTemperature().getMinimumTemp()) + .isEqualTo(updateRequest.getMinimumTemp()); + softly.assertThat(dictionaryPlant.getCareDetail().getRequireHumidity()) + .isEqualTo(updateRequest.getRequireHumidity()); + softly.assertThat(dictionaryPlant.getCareDetail().getPostingPlace()) + .isEqualTo(updateRequest.getPostingPlace()); + softly.assertThat(dictionaryPlant.getCareDetail().getSpecialManageInfo()) + .isEqualTo(updateRequest.getSpecialManageInfo()); + softly.assertThat(dictionaryPlant.getCareDetail().getWaterCycle().getSpring()) + .isEqualTo(updateRequest.getSpring()); + softly.assertThat(dictionaryPlant.getCareDetail().getWaterCycle().getSummer()) + .isEqualTo(updateRequest.getSummer()); + softly.assertThat(dictionaryPlant.getCareDetail().getWaterCycle().getAutumn()) + .isEqualTo(updateRequest.getAutumn()); + softly.assertThat(dictionaryPlant.getCareDetail().getWaterCycle().getWinter()) + .isEqualTo(updateRequest.getWinter()); }); } diff --git a/backend/pium/src/test/java/com/official/pium/support/DictionaryPlantSupport.java b/backend/pium/src/test/java/com/official/pium/support/DictionaryPlantSupport.java index 59151f383..9d9d03466 100644 --- a/backend/pium/src/test/java/com/official/pium/support/DictionaryPlantSupport.java +++ b/backend/pium/src/test/java/com/official/pium/support/DictionaryPlantSupport.java @@ -2,6 +2,10 @@ import com.official.pium.domain.DictionaryPlant; import com.official.pium.domain.WaterCycle; +import com.official.pium.domain.vo.CareDetail; +import com.official.pium.domain.vo.Classification; +import com.official.pium.domain.vo.Property; +import com.official.pium.domain.vo.Temperature; import com.official.pium.repository.DictionaryPlantRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -29,26 +33,36 @@ public DictionaryPlantBuilder name(String name) { public DictionaryPlant build() { return dictionaryPlantRepository.save( DictionaryPlant.builder() - .name(name == null ? "스투키" : name) + .classification(Classification.builder() + .name(name == null ? "스투키" : name) + .familyName("선인장") + .build()) .imageUrl("https://www.costco.co.kr/medias/sys_master/images/hd6/h37/31058517229598.jpg") - .familyName("선인장") - .smell("안남") - .poison("없음") - .manageLevel("어려움") - .growSpeed("빨리자람") - .requireTemp("20도") - .minimumTemp("0도") - .requireHumidity("15%") - .postingPlace("베란다 앞") - .specialManageInfo("물을 많이 주지않아도 됩니다.") - .waterCycle( - WaterCycle.builder() - .spring("겉흙이 마르면 촉촉하게") - .summer("겉흙이 마르면 촉촉하게") - .autumn("겉흙이 마르면 촉촉하게") - .winter("겉흙이 마르면 촉촉하게") - .build() - ).build() + .property(Property.builder() + .smell("안남") + .poison("없음") + .manageLevel("어려움") + .growSpeed("빨리자람") + .build()) + .careDetail(CareDetail.builder() + .temperature(Temperature.builder() + .requireTemp("20도") + .minimumTemp("0도") + .build()) + .requireHumidity("15%") + .postingPlace("베란다 앞") + .specialManageInfo("물을 많이 주지않아도 됩니다.") + .waterCycle( + WaterCycle.builder() + .spring("겉흙이 마르면 촉촉하게") + .summer("겉흙이 마르면 촉촉하게") + .autumn("겉흙이 마르면 촉촉하게") + .winter("겉흙이 마르면 촉촉하게") + .build() + ) + .build() + ) + .build() ); } }