From 90f8ce8df8c2ab56561067ae7218a97e74d97bea Mon Sep 17 00:00:00 2001 From: DongUk <68818952+Kim0914@users.noreply.github.com> Date: Thu, 28 Dec 2023 17:10:37 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EB=AA=A8=EB=91=90=EC=9D=98=20?= =?UTF-8?q?=EC=A0=95=EC=9B=90=20VO=20=EB=9E=98=ED=95=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/official/pium/domain/Garden.java | 32 +++------ .../official/pium/domain/vo/CareDetail.java | 1 - .../official/pium/domain/vo/PlantState.java | 39 ++++++++++ .../pium/domain/{ => vo}/WaterCycle.java | 2 +- .../official/pium/mapper/GardenMapper.java | 71 ------------------- .../official/pium/service/GardenService.java | 33 +++++++-- .../dto/DictionaryPlantCreateRequest.java | 2 +- .../dto/DictionaryPlantUpdateRequest.java | 2 +- .../pium/service/dto/GardenCreateRequest.java | 25 +++++++ .../pium/service/dto/GardenResponse.java | 16 +++++ .../service/dto/SingleGardenResponse.java | 30 +++++++- .../pium/fixture/DictionaryPlantFixture.java | 2 +- .../pium/repository/GardenRepositoryTest.java | 13 ++-- .../repository/HistoryRepositoryTest.java | 2 +- .../pium/support/DictionaryPlantSupport.java | 2 +- .../official/pium/support/GardenSupport.java | 13 ++-- 16 files changed, 170 insertions(+), 115 deletions(-) create mode 100644 backend/pium/src/main/java/com/official/pium/domain/vo/PlantState.java rename backend/pium/src/main/java/com/official/pium/domain/{ => vo}/WaterCycle.java (95%) delete mode 100644 backend/pium/src/main/java/com/official/pium/mapper/GardenMapper.java diff --git a/backend/pium/src/main/java/com/official/pium/domain/Garden.java b/backend/pium/src/main/java/com/official/pium/domain/Garden.java index 84763eb21..343c167e4 100644 --- a/backend/pium/src/main/java/com/official/pium/domain/Garden.java +++ b/backend/pium/src/main/java/com/official/pium/domain/Garden.java @@ -1,6 +1,8 @@ package com.official.pium.domain; +import com.official.pium.domain.vo.PlantState; import jakarta.persistence.Column; +import jakarta.persistence.Embedded; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; @@ -48,21 +50,8 @@ public class Garden extends BaseEntity { @Column(name = "image_url", nullable = false) private String imageUrl; - @NotBlank - @Column(name = "location", nullable = false) - private String location; - - @NotBlank - @Column(name = "flowerpot", nullable = false) - private String flowerpot; - - @NotBlank - @Column(name = "light", nullable = false) - private String light; - - @NotBlank - @Column(name = "wind", nullable = false) - private String wind; + @Embedded + private PlantState plantState; @NotNull @Column(name = "day_since", nullable = false) @@ -84,19 +73,14 @@ public class Garden extends BaseEntity { private String manageLevel; @Builder - public Garden(final DictionaryPlant dictionaryPlant, final Member member, final String nickname, - final String imageUrl, final String location, - final String flowerpot, final String light, final String wind, final Long daySince, - final Integer waterCycle, final String content, - final String manageLevel) { + private Garden(DictionaryPlant dictionaryPlant, Member member, String nickname, String imageUrl, + PlantState plantState, + Long daySince, Integer waterCycle, String content, String manageLevel) { this.dictionaryPlant = dictionaryPlant; this.member = member; this.nickname = nickname; this.imageUrl = imageUrl; - this.location = location; - this.flowerpot = flowerpot; - this.light = light; - this.wind = wind; + this.plantState = plantState; this.daySince = daySince; this.waterCycle = waterCycle; this.content = content; 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 index 6c005b03d..a7a163a31 100644 --- 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 @@ -1,6 +1,5 @@ package com.official.pium.domain.vo; -import com.official.pium.domain.WaterCycle; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; import jakarta.persistence.Embedded; diff --git a/backend/pium/src/main/java/com/official/pium/domain/vo/PlantState.java b/backend/pium/src/main/java/com/official/pium/domain/vo/PlantState.java new file mode 100644 index 000000000..b54a6140d --- /dev/null +++ b/backend/pium/src/main/java/com/official/pium/domain/vo/PlantState.java @@ -0,0 +1,39 @@ +package com.official.pium.domain.vo; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import jakarta.validation.constraints.NotBlank; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Embeddable +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class PlantState { + + @NotBlank + @Column(name = "location", nullable = false) + private String location; + + @NotBlank + @Column(name = "flowerpot", nullable = false) + private String flowerpot; + + @NotBlank + @Column(name = "light", nullable = false) + private String light; + + @NotBlank + @Column(name = "wind", nullable = false) + private String wind; + + @Builder + private PlantState(String location, String flowerpot, String light, String wind) { + this.location = location; + this.flowerpot = flowerpot; + this.light = light; + this.wind = wind; + } +} diff --git a/backend/pium/src/main/java/com/official/pium/domain/WaterCycle.java b/backend/pium/src/main/java/com/official/pium/domain/vo/WaterCycle.java similarity index 95% rename from backend/pium/src/main/java/com/official/pium/domain/WaterCycle.java rename to backend/pium/src/main/java/com/official/pium/domain/vo/WaterCycle.java index b4e3c32e1..1deda1d96 100644 --- a/backend/pium/src/main/java/com/official/pium/domain/WaterCycle.java +++ b/backend/pium/src/main/java/com/official/pium/domain/vo/WaterCycle.java @@ -1,4 +1,4 @@ -package com.official.pium.domain; +package com.official.pium.domain.vo; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; 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 deleted file mode 100644 index b31936699..000000000 --- a/backend/pium/src/main/java/com/official/pium/mapper/GardenMapper.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.official.pium.mapper; - -import com.official.pium.domain.Garden; -import com.official.pium.domain.PetPlant; -import com.official.pium.service.dto.GardenCreateRequest; -import com.official.pium.service.dto.GardenResponse; -import com.official.pium.service.dto.SingleGardenResponse; -import java.time.LocalDate; -import java.util.stream.Collectors; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.springframework.data.domain.Page; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class GardenMapper { - - public static Garden toGarden(GardenCreateRequest request, PetPlant petPlant) { - return Garden.builder() - .dictionaryPlant(petPlant.getDictionaryPlant()) - .member(petPlant.getMember()) - .nickname(petPlant.getNickname()) - .imageUrl(petPlant.getImageUrl()) - .location(petPlant.getLocation()) - .flowerpot(petPlant.getFlowerpot()) - .light(petPlant.getLight()) - .wind(petPlant.getWind()) - .daySince(petPlant.calculateDaySince(LocalDate.now())) - .waterCycle(petPlant.getWaterCycle()) - .content(request.getContent()) - .manageLevel(request.getManageLevel()) - .build(); - } - - public static GardenResponse toGardenResponse(Page gardens) { - return GardenResponse.builder() - .page(gardens.getPageable().getPageNumber()) - .size(gardens.getSize()) - .elementSize(gardens.getTotalElements()) - .hasNext(gardens.hasNext()) - .data(gardens.getContent().stream() - .map(GardenMapper::toSingleGardenResponse) - .collect(Collectors.toList()) - ).build(); - } - - private static SingleGardenResponse toSingleGardenResponse(Garden garden) { - return SingleGardenResponse.builder() - .id(garden.getId()) - .createdAt(garden.getCreatedAt()) - .updatedAt(garden.getUpdatedAt()) - .dictionaryPlantName(garden.getDictionaryPlant().getClassification() - .getName()) - .content(garden.getContent()) - .manageLevel(garden.getManageLevel()) - .petPlant(toPetPlantInfo(garden)) - .build(); - } - - private static SingleGardenResponse.PetPlantInfo toPetPlantInfo(Garden garden) { - return SingleGardenResponse.PetPlantInfo.builder() - .imageUrl(garden.getImageUrl()) - .nickname(garden.getNickname()) - .location(garden.getLocation()) - .flowerpot(garden.getFlowerpot()) - .light(garden.getLight()) - .wind(garden.getWind()) - .daySince(garden.getDaySince()) - .waterCycle(garden.getWaterCycle()) - .build(); - } -} diff --git a/backend/pium/src/main/java/com/official/pium/service/GardenService.java b/backend/pium/src/main/java/com/official/pium/service/GardenService.java index 183f05166..6389d7ceb 100644 --- a/backend/pium/src/main/java/com/official/pium/service/GardenService.java +++ b/backend/pium/src/main/java/com/official/pium/service/GardenService.java @@ -3,11 +3,12 @@ import com.official.pium.domain.Garden; import com.official.pium.domain.Member; import com.official.pium.domain.PetPlant; -import com.official.pium.mapper.GardenMapper; +import com.official.pium.domain.vo.PlantState; import com.official.pium.repository.GardenRepository; import com.official.pium.repository.PetPlantRepository; import com.official.pium.service.dto.GardenCreateRequest; import com.official.pium.service.dto.GardenResponse; +import java.time.LocalDate; import java.util.List; import java.util.NoSuchElementException; import lombok.RequiredArgsConstructor; @@ -29,11 +30,35 @@ public void create(GardenCreateRequest request, Member member) { PetPlant petPlant = petPlantRepository.findById(request.getPetPlantId()) .orElseThrow(() -> new NoSuchElementException("반려 식물이 존재하지 않습니다. id: " + request.getPetPlantId())); checkOwner(petPlant, member); - - Garden garden = GardenMapper.toGarden(request, petPlant); + Garden garden = createGarden(petPlant, request); gardenRepository.save(garden); } + private Garden createGarden(PetPlant petPlant, GardenCreateRequest request) { + return Garden.builder() + .dictionaryPlant(petPlant.getDictionaryPlant()) + .member(petPlant.getMember()) + .nickname(petPlant.getNickname()) + .imageUrl(petPlant.getImageUrl()) + .plantState( + toPlantState(petPlant) + ) + .daySince(petPlant.calculateDaySince(LocalDate.now())) + .waterCycle(petPlant.getWaterCycle()) + .content(request.getContent()) + .manageLevel(request.getManageLevel()) + .build(); + } + + private static PlantState toPlantState(PetPlant petPlant) { + return PlantState.builder() + .location(petPlant.getLocation()) + .flowerpot(petPlant.getFlowerpot()) + .light(petPlant.getLight()) + .wind(petPlant.getWind()) + .build(); + } + private void checkOwner(PetPlant petPlant, Member member) { if (petPlant.isNotOwnerOf(member)) { throw new IllegalArgumentException("요청 사용자와 반려 식물의 사용자가 일치하지 않습니다. memberId: " + member.getId()); @@ -42,6 +67,6 @@ private void checkOwner(PetPlant petPlant, Member member) { public GardenResponse readAll(Pageable pageable, List filters) { Page gardens = gardenRepository.findAllByDictionaryPlantIds(pageable, filters); - return GardenMapper.toGardenResponse(gardens); + return GardenResponse.from(gardens); } } 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 e4f604427..222998cde 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,7 +1,7 @@ package com.official.pium.service.dto; import com.official.pium.domain.DictionaryPlant; -import com.official.pium.domain.WaterCycle; +import com.official.pium.domain.vo.WaterCycle; import com.official.pium.domain.vo.CareDetail; import com.official.pium.domain.vo.Classification; import com.official.pium.domain.vo.Property; 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 89bc48320..1ab22ccc6 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,6 +1,6 @@ package com.official.pium.service.dto; -import com.official.pium.domain.WaterCycle; +import com.official.pium.domain.vo.WaterCycle; import com.official.pium.domain.vo.CareDetail; import com.official.pium.domain.vo.Classification; import com.official.pium.domain.vo.Property; diff --git a/backend/pium/src/main/java/com/official/pium/service/dto/GardenCreateRequest.java b/backend/pium/src/main/java/com/official/pium/service/dto/GardenCreateRequest.java index 892d26dc5..d724555a7 100644 --- a/backend/pium/src/main/java/com/official/pium/service/dto/GardenCreateRequest.java +++ b/backend/pium/src/main/java/com/official/pium/service/dto/GardenCreateRequest.java @@ -1,8 +1,12 @@ package com.official.pium.service.dto; +import com.official.pium.domain.Garden; +import com.official.pium.domain.PetPlant; +import com.official.pium.domain.vo.PlantState; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Positive; +import java.time.LocalDate; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -24,4 +28,25 @@ public class GardenCreateRequest { @NotBlank private String manageLevel; + + public Garden toGarden(PetPlant petPlant) { + return Garden.builder() + .dictionaryPlant(petPlant.getDictionaryPlant()) + .member(petPlant.getMember()) + .nickname(petPlant.getNickname()) + .imageUrl(petPlant.getImageUrl()) + .plantState( + PlantState.builder() + .location(petPlant.getLocation()) + .flowerpot(petPlant.getFlowerpot()) + .light(petPlant.getLight()) + .wind(petPlant.getWind()) + .build() + ) + .daySince(petPlant.calculateDaySince(LocalDate.now())) + .waterCycle(petPlant.getWaterCycle()) + .content(this.content) + .manageLevel(this.manageLevel) + .build(); + } } diff --git a/backend/pium/src/main/java/com/official/pium/service/dto/GardenResponse.java b/backend/pium/src/main/java/com/official/pium/service/dto/GardenResponse.java index 8452cfaef..cde348b91 100644 --- a/backend/pium/src/main/java/com/official/pium/service/dto/GardenResponse.java +++ b/backend/pium/src/main/java/com/official/pium/service/dto/GardenResponse.java @@ -1,11 +1,14 @@ package com.official.pium.service.dto; +import com.official.pium.domain.Garden; import java.util.List; +import java.util.stream.Collectors; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.springframework.data.domain.Page; @Getter @Builder @@ -18,4 +21,17 @@ public class GardenResponse { private Long elementSize; private boolean hasNext; private List data; + + public static GardenResponse from(Page gardens) { + return GardenResponse.builder() + .page(gardens.getPageable().getPageNumber()) + .size(gardens.getSize()) + .elementSize(gardens.getTotalElements()) + .hasNext(gardens.hasNext()) + .data(gardens.getContent().stream() + .map(SingleGardenResponse::from) + .collect(Collectors.toList()) + ).build(); + } + } diff --git a/backend/pium/src/main/java/com/official/pium/service/dto/SingleGardenResponse.java b/backend/pium/src/main/java/com/official/pium/service/dto/SingleGardenResponse.java index ef574ce51..8b3804cee 100644 --- a/backend/pium/src/main/java/com/official/pium/service/dto/SingleGardenResponse.java +++ b/backend/pium/src/main/java/com/official/pium/service/dto/SingleGardenResponse.java @@ -1,5 +1,6 @@ package com.official.pium.service.dto; +import com.official.pium.domain.Garden; import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -21,6 +22,32 @@ public class SingleGardenResponse { private String manageLevel; private PetPlantInfo petPlant; + public static SingleGardenResponse from(Garden garden) { + return SingleGardenResponse.builder() + .id(garden.getId()) + .createdAt(garden.getCreatedAt()) + .updatedAt(garden.getUpdatedAt()) + .dictionaryPlantName(garden.getDictionaryPlant().getClassification() + .getName()) + .content(garden.getContent()) + .manageLevel(garden.getManageLevel()) + .petPlant(toPetPlantInfo(garden)) + .build(); + } + + private static SingleGardenResponse.PetPlantInfo toPetPlantInfo(Garden garden) { + return SingleGardenResponse.PetPlantInfo.builder() + .imageUrl(garden.getImageUrl()) + .nickname(garden.getNickname()) + .location(garden.getPlantState().getLocation()) + .flowerpot(garden.getPlantState().getFlowerpot()) + .light(garden.getPlantState().getLight()) + .wind(garden.getPlantState().getWind()) + .daySince(garden.getDaySince()) + .waterCycle(garden.getWaterCycle()) + .build(); + } + @Getter @NoArgsConstructor public static class PetPlantInfo { @@ -35,7 +62,8 @@ public static class PetPlantInfo { private Integer waterCycle; @Builder - private PetPlantInfo(String imageUrl, String nickname, String location, String flowerpot, String light, String wind, Long daySince, Integer waterCycle) { + private PetPlantInfo(String imageUrl, String nickname, String location, String flowerpot, String light, + String wind, Long daySince, Integer waterCycle) { this.imageUrl = imageUrl; this.nickname = nickname; this.location = location; 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 07c454cfa..c72679b0e 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 @@ -1,7 +1,7 @@ package com.official.pium.fixture; import com.official.pium.domain.DictionaryPlant; -import com.official.pium.domain.WaterCycle; +import com.official.pium.domain.vo.WaterCycle; import com.official.pium.domain.vo.CareDetail; import com.official.pium.domain.vo.Classification; import com.official.pium.domain.vo.Property; diff --git a/backend/pium/src/test/java/com/official/pium/repository/GardenRepositoryTest.java b/backend/pium/src/test/java/com/official/pium/repository/GardenRepositoryTest.java index f3a13201f..c6250c12e 100644 --- a/backend/pium/src/test/java/com/official/pium/repository/GardenRepositoryTest.java +++ b/backend/pium/src/test/java/com/official/pium/repository/GardenRepositoryTest.java @@ -8,6 +8,7 @@ import com.official.pium.domain.Garden; import com.official.pium.domain.Member; import com.official.pium.domain.PetPlant; +import com.official.pium.domain.vo.PlantState; import java.time.LocalDate; import java.util.ArrayList; import java.util.Comparator; @@ -144,10 +145,14 @@ private Garden createGarden() { .member(petPlant.getMember()) .nickname(petPlant.getNickname()) .imageUrl(petPlant.getImageUrl()) - .location(petPlant.getLocation()) - .flowerpot(petPlant.getFlowerpot()) - .light(petPlant.getLight()) - .wind(petPlant.getWind()) + .plantState( + PlantState.builder() + .location(petPlant.getLocation()) + .flowerpot(petPlant.getFlowerpot()) + .light(petPlant.getLight()) + .wind(petPlant.getWind()) + .build() + ) .daySince(petPlant.calculateDaySince(LocalDate.now())) .waterCycle(petPlant.getWaterCycle()) .content("기영이가 아프네요..") 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 d216d9e28..bf3ef50de 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 @@ -10,7 +10,7 @@ import com.official.pium.domain.HistoryType; import com.official.pium.domain.Member; import com.official.pium.domain.PetPlant; -import com.official.pium.domain.WaterCycle; +import com.official.pium.domain.vo.WaterCycle; import com.official.pium.domain.vo.CareDetail; import com.official.pium.domain.vo.Classification; import com.official.pium.domain.vo.Property; 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 9d9d03466..7be34b70d 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 @@ -1,7 +1,7 @@ package com.official.pium.support; import com.official.pium.domain.DictionaryPlant; -import com.official.pium.domain.WaterCycle; +import com.official.pium.domain.vo.WaterCycle; import com.official.pium.domain.vo.CareDetail; import com.official.pium.domain.vo.Classification; import com.official.pium.domain.vo.Property; diff --git a/backend/pium/src/test/java/com/official/pium/support/GardenSupport.java b/backend/pium/src/test/java/com/official/pium/support/GardenSupport.java index eed746f2c..63e7bf11c 100644 --- a/backend/pium/src/test/java/com/official/pium/support/GardenSupport.java +++ b/backend/pium/src/test/java/com/official/pium/support/GardenSupport.java @@ -3,6 +3,7 @@ import com.official.pium.domain.DictionaryPlant; import com.official.pium.domain.Garden; import com.official.pium.domain.Member; +import com.official.pium.domain.vo.PlantState; import com.official.pium.fixture.DictionaryPlantFixture; import com.official.pium.fixture.MemberFixture; import com.official.pium.repository.DictionaryPlantRepository; @@ -47,10 +48,14 @@ public Garden build() { .member(member == null ? memberRepository.save(MemberFixture.generateMember()) : member) .nickname("기영") .imageUrl("imageUrl") - .location("거실") - .flowerpot("토분") - .light("일반 조명") - .wind("바람이 잘 안 통해요") + .plantState( + PlantState.builder() + .location("거실") + .flowerpot("토분") + .light("일반 조명") + .wind("바람이 잘 안 통해요") + .build() + ) .daySince(100L) .waterCycle(3) .content("기영이가 많이 아픈 것 같습니다.")