diff --git a/src/main/java/com/example/play_ground/java/refactor_example/Identifier.java b/src/main/java/com/example/play_ground/java/refactor_example/Identifier.java new file mode 100644 index 0000000..f0aa406 --- /dev/null +++ b/src/main/java/com/example/play_ground/java/refactor_example/Identifier.java @@ -0,0 +1,6 @@ +package com.example.play_ground.java.refactor_example; + +public enum Identifier { + PARTNER_ONE, + PARTNER_TWO +} diff --git a/src/main/java/com/example/play_ground/java/refactor_example/LegacyService.java b/src/main/java/com/example/play_ground/java/refactor_example/LegacyService.java new file mode 100644 index 0000000..3ed18fe --- /dev/null +++ b/src/main/java/com/example/play_ground/java/refactor_example/LegacyService.java @@ -0,0 +1,41 @@ +package com.example.play_ground.java.refactor_example; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@RequiredArgsConstructor +@Service +public class LegacyService { + + private final PartnerOne partnerOne; + + private final PartnerTwo partnerTwo; + + // ... + + // 조회 (예시) + public String retrieve(Map objectMap){ // + // ... + String identifier = (String) objectMap.get("identifier"); + switch (identifier){ + case "giftiCon" : return partnerTwo.retrieve(); + case "giftiShow" : return partnerOne.retrieve(); + default: throw new RuntimeException("custom exception"); + } + // ... + } + + // 취소 (예시) + public String approve(Map objectMap){ // + // ... + String identifier = (String) objectMap.get("identifier"); + switch (identifier){ + case "giftiCon" : return partnerTwo.cancel(); // 어떤 고객사는 망 취소가 없으므로 여기서 명시적으로 cancel + case "giftiShow" : return partnerOne.netCancel(); + default: throw new RuntimeException("custom exception"); + } + // ... + } +} diff --git a/src/main/java/com/example/play_ground/java/refactor_example/PartnerOne.java b/src/main/java/com/example/play_ground/java/refactor_example/PartnerOne.java new file mode 100644 index 0000000..d1ca96a --- /dev/null +++ b/src/main/java/com/example/play_ground/java/refactor_example/PartnerOne.java @@ -0,0 +1,26 @@ +package com.example.play_ground.java.refactor_example; + +import org.springframework.stereotype.Service; + +@Service +public class PartnerOne implements PartnerService { + public String retrieve(){ + return "retrive"; + } + + public String approve(){ + return "approve"; + } + + public String cancel(){ + return "cancel"; + } + + public String netCancel(){ + return "netCancel"; + } + + public Identifier getIdentifier(){ + return Identifier.PARTNER_ONE; + } +} diff --git a/src/main/java/com/example/play_ground/java/refactor_example/PartnerService.java b/src/main/java/com/example/play_ground/java/refactor_example/PartnerService.java new file mode 100644 index 0000000..a3edb05 --- /dev/null +++ b/src/main/java/com/example/play_ground/java/refactor_example/PartnerService.java @@ -0,0 +1,9 @@ +package com.example.play_ground.java.refactor_example; + +public interface PartnerService { + String retrieve(); + String approve(); + String cancel(); + String netCancel(); + Identifier getIdentifier(); +} diff --git a/src/main/java/com/example/play_ground/java/refactor_example/PartnerServiceFactory.java b/src/main/java/com/example/play_ground/java/refactor_example/PartnerServiceFactory.java new file mode 100644 index 0000000..967dc9a --- /dev/null +++ b/src/main/java/com/example/play_ground/java/refactor_example/PartnerServiceFactory.java @@ -0,0 +1,23 @@ +package com.example.play_ground.java.refactor_example; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Component +@RequiredArgsConstructor +public class PartnerServiceFactory { + + private final Map partnerServiceBeans = new HashMap<>(); + + public PartnerServiceFactory(List partnerServiceList) { // List 형태의 파트너서비스 beans 주입 + partnerServiceList.forEach(each -> partnerServiceBeans.put(each.getIdentifier(), each)); + } + + public PartnerService getPartnerService(Identifier identifier) { + return partnerServiceBeans.get(identifier); + } +} diff --git a/src/main/java/com/example/play_ground/java/refactor_example/PartnerTwo.java b/src/main/java/com/example/play_ground/java/refactor_example/PartnerTwo.java new file mode 100644 index 0000000..830ff3f --- /dev/null +++ b/src/main/java/com/example/play_ground/java/refactor_example/PartnerTwo.java @@ -0,0 +1,28 @@ +package com.example.play_ground.java.refactor_example; + +import org.springframework.stereotype.Service; + +@Service +public class PartnerTwo implements PartnerService { + + public String retrieve(){ + return "retrive"; + } + + public String approve(){ + return "approve"; + } + + public String cancel(){ + return "cancel"; + } + + public String netCancel(){ + return "netCancel"; + } + + @Override + public Identifier getIdentifier() { + return Identifier.PARTNER_TWO; + } +} diff --git a/src/main/java/com/example/play_ground/java/refactor_example/RequestDto.java b/src/main/java/com/example/play_ground/java/refactor_example/RequestDto.java new file mode 100644 index 0000000..3275c41 --- /dev/null +++ b/src/main/java/com/example/play_ground/java/refactor_example/RequestDto.java @@ -0,0 +1,7 @@ +package com.example.play_ground.java.refactor_example; + +public record RequestDto( + Identifier identifier + // etc ... +) { +} diff --git a/src/main/java/com/example/play_ground/java/refactor_example/RetrieveService.java b/src/main/java/com/example/play_ground/java/refactor_example/RetrieveService.java new file mode 100644 index 0000000..e9e0771 --- /dev/null +++ b/src/main/java/com/example/play_ground/java/refactor_example/RetrieveService.java @@ -0,0 +1,16 @@ +package com.example.play_ground.java.refactor_example; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class RetrieveService { + + private final PartnerServiceFactory partnerServiceFactory; + + public String retrieve(RequestDto requestDto){ + PartnerService partnerService = partnerServiceFactory.getPartnerService(requestDto.identifier()); + return partnerService.retrieve(); + } +}