Skip to content
This repository was archived by the owner on Jan 2, 2026. It is now read-only.

Commit 822822c

Browse files
✨ Feat: #19 공공데이터 저장 값 반환
* 📦Chore: API 응답 파싱을 위한 의존성 라이브러리, 환경변수 추가 * ✨Feat: API 요청용 객체 추가 * 📦 Chore: 주석 추가 * ✨ Feat: 의약품 상세정보 API 호출 개발 * ✨ Feat: 샘플 검색 데이터 추출 개발 * ✨ Feat: 공공데이터 API 파싱 개발 * ♻️ Refactor: 파싱을 위한 Wrappeer 클래스 정리 (인터페이스 추가) * ♻️ Refactor: 불필요한 생성자 삭제 * ♻️ Refactor: aricle parsing 가독성 개선 * 🐛 Fix: SectionWrapper parseElement 오타 수정 * ♻️ Refactor: 로직 수정 및 가독성 개선 * ♻️ Refactor: Paragraph 파싱 수정 및 헥사고날 아키텍처 적용 * ♻️ Refactor: 도메인 메소드 접근자 변경 * 📦 gitignore 수정 및 재 커밋 * ✨ Feat: api 전체 데이터 저장 * 🐛 Fix: Xml 파서에 null 체크 로직 추가 * ✨ Feat: 공공데이터 전체 저장 기능 개발 * ♻️ Refactor: 전체 데이터 저장 함수 리팩토링 * ✨ Feat: 공공데이터 도메인 객체 추가 --------- Co-authored-by: HaechangLee <112938092+HaechangLee@users.noreply.github.com>
1 parent 8b5bbee commit 822822c

19 files changed

Lines changed: 529 additions & 3 deletions
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.likelion.backendplus4.yakplus;
2+
3+
import org.springframework.stereotype.Controller;
4+
import org.springframework.web.bind.annotation.GetMapping;
5+
import org.springframework.web.client.RestTemplate;
6+
7+
@Controller
8+
public class RestTempTest {
9+
10+
@GetMapping("/sibar")
11+
public void tester(){
12+
RestTempTest.main();
13+
}
14+
public static void main() {
15+
try {
16+
// URI uri = UriComponentsBuilder.newInstance()
17+
// .scheme("https")
18+
// .host("apis.data.go.kr")
19+
// .port(443)
20+
// .path("/1471000/DrugPrdtPrmsnInfoService06/getDrugPrdtPrmsnDtlInq05")
21+
// .queryParam("serviceKey",
22+
// "kHctorEOW58GMVU768tVFqRHC6ytY0HrNiZxXY10hMb7UkEkZJKzmW+1uSx5bgM/wi9h94UoZ31oKDh+xKjQGQ==")
23+
// .queryParam("type", "json")
24+
// .queryParam("numOfRows", 1)
25+
// .build(true)
26+
// .toUri();
27+
28+
RestTemplate template = new RestTemplate();
29+
String url = "https://apis.data.go.kr/1471000/DrugPrdtPrmsnInfoService06/getDrugPrdtPrmsnDtlInq05?type=json&numOfRows=5&serviceKey=kHctorEOW58GMVU768tVFqRHC6ytY0HrNiZxXY10hMb7UkEkZJKzmW+1uSx5bgM/wi9h94UoZ31oKDh+xKjQGQ==";
30+
String response = template.getForObject(url, String.class);
31+
System.out.println("response = " + response);
32+
} catch (Exception e) {
33+
e.printStackTrace();
34+
}
35+
}
36+
}

src/main/java/com/likelion/backendplus4/yakplus/scraper/drug/ApiResponseMapper.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,4 @@ public static int getTotalCountFromResponse(String response) {
3737
throw new RuntimeException(e);
3838
}
3939
}
40-
4140
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.likelion.backendplus4.yakplus.scraper.drug.detail.adapter.in.web;
2+
3+
import java.util.List;
4+
5+
import org.springframework.stereotype.Controller;
6+
import org.springframework.web.bind.annotation.GetMapping;
7+
import org.springframework.web.bind.annotation.RestController;
8+
9+
import com.likelion.backendplus4.yakplus.scraper.drug.detail.application.port.in.DrugDataUseCase;
10+
import com.likelion.backendplus4.yakplus.scraper.drug.detail.domain.model.GovDrug;
11+
12+
import lombok.RequiredArgsConstructor;
13+
import lombok.extern.slf4j.Slf4j;
14+
15+
@RestController
16+
@Slf4j
17+
@RequiredArgsConstructor
18+
public class ApiDataTestController {
19+
private final DrugDataUseCase drugDataUseCase;
20+
21+
@GetMapping("/data/all")
22+
public List<GovDrug> getAllData(){
23+
log.info("getAllData");
24+
return drugDataUseCase.findAllRawDrug();
25+
}
26+
27+
}

src/main/java/com/likelion/backendplus4/yakplus/scraper/drug/detail/adapter/out/gov/ApiUriCompBuilder.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,22 @@ public class ApiUriCompBuilder {
2222
private final String API_DETAIL_PATH;
2323
private final String API_IMG_PATH ;
2424
private final String RESPONSE_TYPE;
25+
private final int NUM_OF_ROWS;
26+
2527

2628
public ApiUriCompBuilder(@Value("${gov.host}") String host,
2729
@Value("${gov.serviceKey}") String serviceKey,
2830
@Value("${gov.path.detail}") String pathDetail,
2931
@Value("${gov.path.img}") String pathImg,
32+
@Value("${gov.type}") String type,
33+
@Value("${gov.numOfRows}") int numOfRows
3034
@Value("${gov.type}") String type) {
3135
this.HOST = host;
3236
this.SERVICE_KEY = serviceKey;
3337
this.API_DETAIL_PATH = pathDetail;
3438
this.API_IMG_PATH = pathImg;
3539
this.RESPONSE_TYPE = type;
40+
this.NUM_OF_ROWS = numOfRows;
3641
}
3742

3843
/***
@@ -53,7 +58,7 @@ private URI getUri(String path, int pageNo) {
5358
.queryParam("serviceKey", SERVICE_KEY)
5459
.queryParam("type", RESPONSE_TYPE)
5560
.queryParam("pageNo", pageNo)
56-
.queryParam("numOfRows", 100)
61+
.queryParam("numOfRows", NUM_OF_ROWS)
5762
.build(true)
5863
.toUri();
5964
}
@@ -96,5 +101,4 @@ public URI getUriForImgApiBySeq(String seq) {
96101
.toUri();
97102

98103
}
99-
100104
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.likelion.backendplus4.yakplus.scraper.drug.detail.adapter.out.persistence;
2+
3+
import java.time.LocalDate;
4+
5+
import com.fasterxml.jackson.annotation.JsonCreator;
6+
import com.fasterxml.jackson.annotation.JsonFormat;
7+
import com.fasterxml.jackson.annotation.JsonProperty;
8+
9+
import jakarta.persistence.Column;
10+
import jakarta.persistence.Entity;
11+
import jakarta.persistence.Id;
12+
import jakarta.persistence.Table;
13+
import lombok.AllArgsConstructor;
14+
import lombok.Builder;
15+
import lombok.Getter;
16+
import lombok.NoArgsConstructor;
17+
18+
@Entity
19+
@Getter
20+
@Builder
21+
@NoArgsConstructor
22+
@AllArgsConstructor
23+
@Table(name="GOV_DRUG_RAW_DATA")
24+
public class GovDrugEntity {
25+
@Id
26+
@Column(name="ITEM_SEQ")
27+
private Long id;
28+
29+
@Column( name= "ITEM_NAME", columnDefinition = "TEXT")
30+
private String drugName;
31+
32+
@Column( name= "ENTP_NAME")
33+
private String company;
34+
35+
@Column( name= "ITEM_PERMIT_DATE")
36+
private LocalDate permitDate;
37+
38+
@Column(name = "ETC_OTC_CODE")
39+
private boolean isGeneral;
40+
41+
@Column(name = "MATERIAL_NAME", columnDefinition = "JSON")
42+
private String materialInfo;
43+
44+
@JsonProperty("STORAGE_METHOD")
45+
@Column(name = "STORAGE_METHOD", columnDefinition = "TEXT")
46+
private String storeMethod;
47+
48+
@Column(name = "VALID_TERM")
49+
private String validTerm;
50+
51+
@Column(name = "EE_DOC_DATA", columnDefinition = "JSON")
52+
private String efficacy;
53+
54+
@Column(name = "UD_DOC_DATA", columnDefinition = "JSON")
55+
private String usage;
56+
57+
@Column(name = "NB_DOC_DATA", columnDefinition = "JSON")
58+
private String precaution;
59+
60+
@Column(name= "IMG_URL")
61+
private String imageUrl;
62+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.likelion.backendplus4.yakplus.scraper.drug.detail.adapter.out.persistence;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
5+
public interface GovDrugJpaRepository extends JpaRepository<GovDrugEntity, Long> {
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.likelion.backendplus4.yakplus.scraper.drug.detail.adapter.out.persistence;
2+
3+
import java.util.List;
4+
5+
import org.springframework.stereotype.Component;
6+
7+
import com.likelion.backendplus4.yakplus.scraper.drug.detail.application.port.out.DrugRepositoryPort;
8+
9+
import lombok.RequiredArgsConstructor;
10+
11+
@Component
12+
@RequiredArgsConstructor
13+
public class GovDrugRepositoryAdapter implements DrugRepositoryPort {
14+
private final GovDrugJpaRepository govDrungJpaRepository;
15+
16+
@Override
17+
public List<GovDrugEntity> findAll() {
18+
return govDrungJpaRepository.findAll();
19+
}
20+
21+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.likelion.backendplus4.yakplus.scraper.drug.detail.application.port.in;
2+
3+
import java.util.List;
4+
5+
import com.likelion.backendplus4.yakplus.scraper.drug.detail.domain.model.GovDrug;
6+
7+
public interface DrugDataUseCase {
8+
List<GovDrug> findAllRawDrug();
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.likelion.backendplus4.yakplus.scraper.drug.detail.application.port.out;
2+
3+
import java.util.List;
4+
5+
import com.likelion.backendplus4.yakplus.scraper.drug.detail.adapter.out.persistence.GovDrugEntity;
6+
7+
public interface DrugRepositoryPort {
8+
List<GovDrugEntity> findAll();
9+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.likelion.backendplus4.yakplus.scraper.drug.detail.application.service;
2+
3+
import com.likelion.backendplus4.yakplus.scraper.drug.detail.adapter.out.persistence.GovDrugEntity;
4+
import com.likelion.backendplus4.yakplus.scraper.drug.detail.domain.model.GovDrug;
5+
6+
public class DrugDataMapper {
7+
public static GovDrug toDomainFromEntity(GovDrugEntity e){
8+
return GovDrug.builder()
9+
.drugId(e.getId())
10+
.drugName(e.getDrugName())
11+
.company(e.getCompany())
12+
.permitDate(e.getPermitDate())
13+
.isGeneral(e.isGeneral())
14+
.materialInfo(e.getMaterialInfo())
15+
.storeMethod(e.getStoreMethod())
16+
.validTerm(e.getValidTerm())
17+
.efficacy(e.getEfficacy())
18+
.usage(e.getUsage())
19+
.precaution(e.getPrecaution())
20+
.imageUrl(e.getImageUrl())
21+
.build();
22+
}
23+
}

0 commit comments

Comments
 (0)