Skip to content

Commit 8d3d45d

Browse files
authored
Merge pull request #252 from prgrms-aibe-devcourse/refactor/v2-youthpolicy
refactor: 청년정책 리팩토링efactor: 청년정책 리팩토링
2 parents 54f6c77 + 4c7a383 commit 8d3d45d

8 files changed

Lines changed: 298 additions & 0 deletions

File tree

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package store.lastdance.controller.youthpolicy;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.springframework.http.HttpStatus;
5+
import org.springframework.http.ResponseEntity;
6+
import org.springframework.web.bind.annotation.*;
7+
import store.lastdance.dto.youthpolicy.YouthPolicyDTO;
8+
import store.lastdance.service.youthpolicy.YouthPolicyV2CommandService;
9+
import store.lastdance.service.youthpolicy.YouthPolicyV2QueryService;
10+
11+
import java.util.List;
12+
import java.util.NoSuchElementException;
13+
14+
@RestController
15+
@RequiredArgsConstructor
16+
@RequestMapping("/api/v2/youth-policy")
17+
public class YouthPolicyV2Controller {
18+
19+
private final YouthPolicyV2CommandService youthPolicyV2CommandService;
20+
private final YouthPolicyV2QueryService youthPolicyV2QueryService;
21+
22+
@GetMapping
23+
public List<YouthPolicyDTO> getAllPolicies() {
24+
return youthPolicyV2QueryService.getAllPolicies();
25+
}
26+
27+
@GetMapping("/{plcyNo}")
28+
public ResponseEntity<YouthPolicyDTO> getPolicyByPlcyNo(@PathVariable String plcyNo) {
29+
try {
30+
YouthPolicyDTO policy = youthPolicyV2QueryService.getPolicyByPlcyNo(plcyNo);
31+
return ResponseEntity.ok(policy);
32+
} catch (NoSuchElementException e) {
33+
return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
34+
}
35+
}
36+
37+
@PostMapping("/test")
38+
public ResponseEntity<String> syncNow() {
39+
youthPolicyV2CommandService.syncPoliciesWithOpenApi();
40+
return ResponseEntity.ok("정책 동기화 완료");
41+
}
42+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package store.lastdance.converter.youthpolicy;
2+
3+
import org.springframework.stereotype.Component;
4+
import store.lastdance.domain.youthpolicy.YouthPolicy;
5+
import store.lastdance.dto.youthpolicy.YouthPolicyDTO;
6+
7+
@Component
8+
public class YouthPolicyConverter {
9+
10+
public YouthPolicyDTO convertToDto(YouthPolicy policy) {
11+
return YouthPolicyDTO.builder()
12+
.plcyNo(policy.getPlcyNo())
13+
.plcyNm(policy.getPlcyNm())
14+
.plcyKywdNm(policy.getPlcyKywdNm())
15+
.plcyExplnCn(policy.getPlcyExplnCn())
16+
.bizPrdBgngYmd(policy.getBizPrdBgngYmd())
17+
.plcyStDt(policy.getBizPrdBgngYmd())
18+
.plcyEndDt(policy.getBizPrdEndYmd())
19+
.bizPrdEndYmd(policy.getBizPrdEndYmd())
20+
.aplyYmd(policy.getAplyYmd())
21+
.plcySprtCn(policy.getPlcySprtCn())
22+
.lclsfNm(policy.getLclsfNm())
23+
.mclsfNm(policy.getMclsfNm())
24+
.build();
25+
}
26+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package store.lastdance.service.youthpolicy;
2+
3+
public interface YouthPolicyV2CommandService {
4+
void syncPoliciesWithOpenApi();
5+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package store.lastdance.service.youthpolicy;
2+
3+
import com.fasterxml.jackson.databind.JsonNode;
4+
import lombok.RequiredArgsConstructor;
5+
import org.springframework.stereotype.Service;
6+
import org.springframework.transaction.annotation.Transactional;
7+
import store.lastdance.domain.youthpolicy.YouthPolicy;
8+
import store.lastdance.repository.youthpolicy.YouthPolicyRepository;
9+
import store.lastdance.util.youthpolicy.YouthPolicyClient;
10+
11+
import java.time.LocalDate;
12+
13+
@Service
14+
@RequiredArgsConstructor
15+
public class YouthPolicyV2CommandServiceImpl implements YouthPolicyV2CommandService {
16+
17+
private final YouthPolicyClient policyClient;
18+
private final YouthPolicyRepository policyRepository;
19+
20+
@Override
21+
@Transactional
22+
public void syncPoliciesWithOpenApi() {
23+
policyRepository.deleteAll();
24+
25+
int page = 1;
26+
int pageSize = 3;
27+
boolean hasMore = true;
28+
29+
LocalDate today = LocalDate.now();
30+
31+
while (hasMore) {
32+
JsonNode result = policyClient.getYouthPolicies(page, pageSize, "");
33+
JsonNode list = result.path("result").path("youthPolicyList");
34+
35+
if (list.isEmpty()) break;
36+
37+
for (JsonNode node : list) {
38+
String endDate = node.path("bizPrdEndYmd").asText();
39+
if (endDate.isEmpty() || endDate.compareTo(today.toString().replaceAll("-", "")) < 0) continue;
40+
41+
// aplyYmd가 null이거나 비어있으면 저장하지 않도록 추가된 로직
42+
String aplyYmd = node.path("aplyYmd").asText();
43+
if (aplyYmd == null || aplyYmd.isEmpty()) {
44+
continue;
45+
}
46+
47+
YouthPolicy policy = YouthPolicy.builder()
48+
.plcyNo(node.path("plcyNo").asText())
49+
.plcyNm(node.path("plcyNm").asText())
50+
.plcyKywdNm(node.path("plcyKywdNm").asText())
51+
.plcyExplnCn(node.path("plcyExplnCn").asText())
52+
.bizPrdBgngYmd(node.path("bizPrdBgngYmd").asText())
53+
.bizPrdEndYmd(endDate)
54+
.aplyYmd(aplyYmd)
55+
.plcySprtCn(node.path("plcySprtCn").asText())
56+
.lclsfNm(node.path("lclsfNm").asText())
57+
.mclsfNm(node.path("mclsfNm").asText())
58+
.build();
59+
60+
policyRepository.save(policy);
61+
}
62+
63+
page++;
64+
hasMore = list.size() == pageSize;
65+
}
66+
}
67+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package store.lastdance.service.youthpolicy;
2+
3+
import java.util.List;
4+
import store.lastdance.dto.youthpolicy.YouthPolicyDTO;
5+
6+
public interface YouthPolicyV2QueryService {
7+
List<YouthPolicyDTO> getAllPolicies();
8+
9+
YouthPolicyDTO getPolicyByPlcyNo(String plcyNo);
10+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package store.lastdance.service.youthpolicy;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.springframework.stereotype.Service;
5+
import org.springframework.transaction.annotation.Transactional;
6+
import store.lastdance.domain.youthpolicy.YouthPolicy;
7+
import store.lastdance.dto.youthpolicy.YouthPolicyDTO;
8+
import store.lastdance.repository.youthpolicy.YouthPolicyRepository;
9+
import store.lastdance.converter.youthpolicy.YouthPolicyConverter;
10+
11+
import java.util.List;
12+
import java.util.NoSuchElementException;
13+
import java.util.stream.Collectors;
14+
15+
@Service
16+
@RequiredArgsConstructor
17+
@Transactional(readOnly = true)
18+
public class YouthPolicyV2QueryServiceImpl implements YouthPolicyV2QueryService {
19+
20+
private final YouthPolicyRepository policyRepository;
21+
private final YouthPolicyConverter youthPolicyConverter;
22+
23+
@Override
24+
public List<YouthPolicyDTO> getAllPolicies() {
25+
return policyRepository.findAll().stream()
26+
.map(youthPolicyConverter::convertToDto)
27+
.collect(Collectors.toList());
28+
}
29+
30+
@Override
31+
public YouthPolicyDTO getPolicyByPlcyNo(String plcyNo) {
32+
return policyRepository.findByPlcyNo(plcyNo)
33+
.map(youthPolicyConverter::convertToDto)
34+
.orElseThrow(() -> new NoSuchElementException("정책을 찾을 수 없습니다: " + plcyNo));
35+
}
36+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package store.lastdance.service.youthpolicy;
2+
3+
import java.util.List;
4+
import store.lastdance.dto.youthpolicy.YouthPolicyDTO;
5+
6+
public interface YouthPolicyV2Service {
7+
List<YouthPolicyDTO> getAllPolicies();
8+
9+
YouthPolicyDTO getPolicyByPlcyNo(String plcyNo);
10+
11+
void syncPoliciesWithOpenApi();
12+
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package store.lastdance.service.youthpolicy;
2+
3+
import com.fasterxml.jackson.databind.JsonNode;
4+
import lombok.RequiredArgsConstructor;
5+
import org.springframework.stereotype.Service;
6+
import store.lastdance.domain.youthpolicy.YouthPolicy;
7+
import store.lastdance.dto.youthpolicy.YouthPolicyDTO;
8+
import store.lastdance.repository.youthpolicy.YouthPolicyRepository;
9+
import store.lastdance.util.youthpolicy.YouthPolicyClient;
10+
11+
import java.time.LocalDate;
12+
import java.util.List;
13+
import java.util.NoSuchElementException;
14+
import java.util.stream.Collectors;
15+
16+
@Service
17+
@RequiredArgsConstructor
18+
public class YouthPolicyV2ServiceImpl implements YouthPolicyV2Service { // Implement V2 Service
19+
20+
private final YouthPolicyClient policyClient;
21+
private final YouthPolicyRepository policyRepository;
22+
23+
@Override
24+
public List<YouthPolicyDTO> getAllPolicies() {
25+
return policyRepository.findAll().stream()
26+
.map(this::convertToDto)
27+
.collect(Collectors.toList());
28+
}
29+
30+
@Override
31+
public YouthPolicyDTO getPolicyByPlcyNo(String plcyNo) {
32+
return policyRepository.findByPlcyNo(plcyNo)
33+
.map(this::convertToDto)
34+
.orElseThrow(() -> new NoSuchElementException("정책을 찾을 수 없습니다: " + plcyNo));
35+
}
36+
37+
@Override
38+
public void syncPoliciesWithOpenApi() {
39+
policyRepository.deleteAll();
40+
41+
int page = 1;
42+
int pageSize = 3;
43+
boolean hasMore = true;
44+
45+
LocalDate today = LocalDate.now();
46+
47+
while (hasMore) {
48+
JsonNode result = policyClient.getYouthPolicies(page, pageSize, "");
49+
JsonNode list = result.path("result").path("youthPolicyList");
50+
51+
if (list.isEmpty()) break;
52+
53+
for (JsonNode node : list) {
54+
String endDate = node.path("bizPrdEndYmd").asText();
55+
if (endDate.isEmpty() || endDate.compareTo(today.toString().replaceAll("-", "")) < 0) continue;
56+
57+
// aplyYmd가 null이거나 비어있으면 저장하지 않도록 추가된 로직
58+
String aplyYmd = node.path("aplyYmd").asText();
59+
if (aplyYmd == null || aplyYmd.isEmpty()) {
60+
continue;
61+
}
62+
63+
YouthPolicy policy = YouthPolicy.builder()
64+
.plcyNo(node.path("plcyNo").asText())
65+
.plcyNm(node.path("plcyNm").asText())
66+
.plcyKywdNm(node.path("plcyKywdNm").asText())
67+
.plcyExplnCn(node.path("plcyExplnCn").asText())
68+
.bizPrdBgngYmd(node.path("bizPrdBgngYmd").asText())
69+
.bizPrdEndYmd(endDate)
70+
.aplyYmd(aplyYmd)
71+
.plcySprtCn(node.path("plcySprtCn").asText())
72+
.lclsfNm(node.path("lclsfNm").asText())
73+
.mclsfNm(node.path("mclsfNm").asText())
74+
.build();
75+
76+
policyRepository.save(policy);
77+
}
78+
79+
page++;
80+
hasMore = list.size() == pageSize;
81+
}
82+
}
83+
84+
private YouthPolicyDTO convertToDto(YouthPolicy policy) {
85+
return YouthPolicyDTO.builder()
86+
.plcyNo(policy.getPlcyNo())
87+
.plcyNm(policy.getPlcyNm())
88+
.plcyKywdNm(policy.getPlcyKywdNm())
89+
.plcyExplnCn(policy.getPlcyExplnCn())
90+
.bizPrdBgngYmd(policy.getBizPrdBgngYmd())
91+
.plcyStDt(policy.getBizPrdBgngYmd())
92+
.plcyEndDt(policy.getBizPrdEndYmd())
93+
.bizPrdEndYmd(policy.getBizPrdEndYmd())
94+
.aplyYmd(policy.getAplyYmd())
95+
.plcySprtCn(policy.getPlcySprtCn())
96+
.lclsfNm(policy.getLclsfNm())
97+
.mclsfNm(policy.getMclsfNm())
98+
.build();
99+
}
100+
}

0 commit comments

Comments
 (0)