Burger
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; import java.io.Serializable; import java.util.List; @AllArgsConstructor @NoArgsConstructor @ToString @Data public class Burger implements Serializable { private String name; private int price; private List ingredients; }
BurgerTest
import com.example.firstproject.ioc.Ingredient; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import org.junit.jupiter.api.Test; import org.springframework.test.web.reactive.server.WebTestClient; import javax.persistence.criteria.CriteriaBuilder; import java.util.Arrays; import java.util.List; import static org.junit.jupiter.api.Assertions.*; class BurgerTest { @Test public void 자바_객체를_JSON으로_변환() throws JsonProcessingException { ObjectMapper objectMapper=new ObjectMapper(); List ingredients= Arrays.asList("치즈", "쇠고기", "새우"); Burger burger=new Burger("맥도날드 햄버거", 4500, ingredients); //자바 객체를 JSON 으로 변환 String json =objectMapper.writeValueAsString(burger); //테스트 검증 String expected="{\"name\":\"맥도날드 햄버거\",\"price\":4500,\"ingredients\":[\"치즈\",\"쇠고기\",\"새우\"]}"; assertEquals(expected, json); //JSON 이쁘게 출력 JsonNode jsonNode =objectMapper.readTree(json); System.out.println(jsonNode.toPrettyString()); } @Test public void JSON을_자바_객체로_변환() throws JsonProcessingException { ObjectMapper objectMapper=new ObjectMapper(); String json="{\"name\":\"맥도날드 햄버거\",\"price\":4500,\"ingredients\":[\"치즈\",\"쇠고기\",\"새우\"]}"; //JSON을 자바 객체로 변환 Burger burger=objectMapper.readValue(json, Burger.class); List ingredients= Arrays.asList("치즈", "쇠고기", "새우"); Burger expected=new Burger("맥도날드 햄버거", 4500, ingredients); //테스트 검증 assertEquals(expected.toString(), burger.toString()); System.out.println(json); System.out.println(burger.toString()); //JSON 이쁘게 출력 JsonNode jsonNode=objectMapper.readTree(json); System.out.println(jsonNode.toPrettyString()); } @Test public void JSON_Node_를_직접생성() throws JsonProcessingException{ ObjectMapper objectMapper = new ObjectMapper(); /* { "name" : "맥도날드 햄버거", "price" : 4500, "ingredients" : [ "치즈", "쇠고기", "새우" ] } */ ObjectNode objectNode=objectMapper.createObjectNode(); objectNode.put("name", "맥도날드 햄버거"); objectNode.put("price", 4500); ArrayNode arrayNode=objectMapper.createArrayNode(); arrayNode.add("치즈"); arrayNode.add("쇠고기"); arrayNode.add("새우"); objectNode.set("ingredients", arrayNode); String json =objectNode.toString(); System.out.println(" 값 =>"); System.out.println(json); System.out.println(objectNode.toPrettyString()); } }
스프링 부트 에서는 ResponseEntity 객체를 통해 자동으로 json 으로 전환처리 된다.
ResponseEntity 에 리스트 객체만 넣고 반화처리만 해주면 된다.
ResponseEntity>
예)
import java.util.List; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.pcw.prod.model.Product; import com.pcw.utils.DanawProductCrawling; @RestController @RequestMapping("/api") public class ProductApiController { /** * 인덱스 메인화면 상품 목록 가져오기 * @return */ @GetMapping(value = "/mainProducts") public ResponseEntity> mainProducts(DanawProductCrawling danawProductCrawling) { //다나와 메인 인덱스 화면 제품만 가져오기 List product=danawProductCrawling.getMainProducts(); return ResponseEntity.status(HttpStatus.OK).body(product); } }
json 출력물
// 20220529153538 // http://localhost/api/mainProducts [ { "id": "13621058", "thumbLink": "http://prod.danawa.com/info/?pcode=13621058&cate=11236452", "thumbImage": "//img.danawa.com/prod_img/500000/058/621/img/13621058_1.jpg?shrink=130:130&_v=20220125170310", "prodName": "레노버 LEGION 5 Pro 16ACH R7 STORM", "specList": "40.6cm(16인치) / AMD / 라이젠7-4세대 / 세잔 / 5800H (3.2GHz) / 옥타코어 / 운영체제(OS): 미포함(프리도스) / 2560x1600(WQXGA) / NTSC: 72% / sRGB: 100% / 500nit / 주사율: 165Hz / IPS / 광시야각 / 눈부심방지 / 슬림형 베젤 / DDR4 / 메모리: 16GB / 3200MHz / M.2(NVMe) / 512GB / 외장그래픽 / RTX3060 / TGP: 130W / VRAM:6GB / 기가비트 유선랜 / 802.11ax(Wi-Fi 6) / HDMI 2.1 / 웹캠(HD) / USB-C: 지원 / USB 3.0 / RGB 라이트 / 웹캠OFF 지원 / ㅗ형 방향키 / 숫자 키패드(4열) / 배터리: 80Wh / 충전단자: 전용포트 / 두께: 21.7mm / 무게: 2.59kg / 일반유통상품 / 용도: 게임용, 그래픽작업용 / 색상: 그레이 / 2021년 12월 제조사 MTM 변경 (82JQ003MKR > 82JQ00SDKR)", "mtDate": "2021.03.", "price": 1625000 }, { "id": "adReaderProductItem12625265", "thumbLink": "http://prod.danawa.com/info/?pcode=12625265&cate=112747", "thumbImage": "//img.danawa.com/prod_img/500000/265/625/img/12625265_1.jpg?shrink=130:130", "prodName": "AMD 라이젠5-4세대 5600X (버미어) (멀티팩(정품))", "specList": "AMD(소켓AM4) / 4세대(Zen3) / 7nm / 6코어 / 12쓰레드 / 기본 클럭: 3.7GHz / 최대 클럭: 4.6GHz / L3 캐시: 32MB / TDP: 65W / PCIe4.0 / 메모리 규격: DDR4 / 3200MHz / 내장그래픽: 미탑재 / 기술 지원: StoreMI, Ryzen Master, VR Ready 프리미엄 / 쿨러: Wraith Stealth 포함", "mtDate": "2020.11.", "price": 211420 }, { "id": "adReaderProductItem16084070", "thumbLink": "http://prod.danawa.com/info/?pcode=16084070&cate=112751", "thumbImage": "//img.danawa.com/prod_img/500000/070/084/img/16084070_1.jpg?shrink=130:130", "prodName": "ASUS PRIME B660M-K D4 인텍앤컴퍼니", "specList": "인텔(소켓1700) / 인텔 B660 / M-ATX (24.4x21.1cm) / 전원부: 6+1+1페이즈 / 메모리 DDR4 / 5333MHz (PC4-42600) / 2개 / 메모리 용량: 최대 64GB / XMP / 옵테인 / 확장슬롯 VGA 연결: PCIe4.0 x16 / PCIe버전: PCIe4.0, PCIe3.0, PCIe / PCIex16: 1개 / PCIex1: 2개 / 저장장치 SATA3: 4개 / M.2: 2개 / PCIe / NVMe / PCIe4.0 / 후면단자 D-SUB / HDMI / USB 3.0 / USB 2.0 / RJ-45 / 오디오잭 / PS/2 / 랜/오디오 Realtek 계열 / 최대 기가비트 / RJ-45: 1개 / Realtek 계열 / 7.1채널(8ch) / 내부I/O RGB 헤더(4핀): 1개 / 시스템팬 헤더(4핀): 1개 / USB2.0 헤더: 2개 / USB3.0 헤더: 1개 / 특징 UEFI / LED 헤더 / TPM헤더", "mtDate": "2022.01.", "price": 142850 }, { "id": "14397899", "thumbLink": "http://prod.danawa.com/info/?pcode=14397899&cate=112753", "thumbImage": "//img.danawa.com/prod_img/500000/899/397/img/14397899_1.jpg?shrink=130:130&_v=20220517143454", "prodName": "MSI 지포스 RTX 3080 Ti 슈프림 X D6X 12GB 트라이프로져2S", "specList": "RTX 3080 Ti / 8nm / 부스트클럭: 1845MHz / 스트림 프로세서: 10240개 / PCIe4.0x16 / GDDR6X(DDR6X) / 출력단자: HDMI2.1, DP1.4 / 부가기능: 제로팬(0-dB기술), 8K 해상도 지원, 4K 해상도 지원, HDR 지원, Dual BIOS, HDCP 2.3 / 사용전력: 최대 400W / 정격파워 850W 이상 / 전원 포트: 8핀 x3개 / 3개 팬 / 가로(길이): 336mm / 백플레이트 / LED 라이트 / MYSTIC LIGHT / 그래픽카드 지지대 포함", "mtDate": "2021.06.", "price": 1597000 }, { "id": "adReaderProductItem11961251", "thumbLink": "http://prod.danawa.com/info/?pcode=11961251&cate=112760", "thumbImage": "//img.danawa.com/prod_img/500000/251/961/img/11961251_1.jpg?shrink=130:130", "prodName": "타무즈 GK600 PRIME (250GB)", "specList": "내장형SSD / 6.4cm(2.5형) / SATA3 (6Gb/s) / TLC(기타) / 3D낸드 / DDR3 256MB / 컨트롤러: 실리콘모션 / [성능] 순차읽기: 560MB/s / 순차쓰기: 520MB/s / 읽기IOPS: 90K / 쓰기IOPS: 90K / [지원기능] TRIM / GC / SLC캐싱 / S.M.A.R.T / DEVSLP / ECC / [환경특성] TBW: 200TB / A/S기간: 5년 / 두께: 7mm / [기타] 컨트롤러 SM2259H 또는 SM2258H / 탑재된 컨트롤러 확인요망", "mtDate": "2020.08.", "price": 47000 }, { "id": "15354266", "thumbLink": "http://prod.danawa.com/info/?pcode=15354266&cate=11236849", "thumbImage": "//img.danawa.com/prod_img/500000/266/354/img/15354266_1.jpg?shrink=130:130&_v=20211001100127", "prodName": "다나와표준PC 게임용 211009", "specList": "AMD / 라이젠5-4세대 / 세잔 / 5600G (3.9GHz) / (AMD) A520 / DDR4 / 16GB / SSD / 240GB / 라데온 그래픽스 7 / 1Gbps 유선 / HDMI / D-SUB / USB 3.0 / 500W / 운영체제 미포함 / 미들타워 / 용도: 사무/인강용", "mtDate": "2021.10.", "price": 491040 }, { "id": "adReaderProductItem16193474", "thumbLink": "http://prod.danawa.com/info/?pcode=16193474&cate=112752", "thumbImage": "//img.danawa.com/prod_img/500000/474/193/img/16193474_1.jpg?shrink=130:130", "prodName": "G.SKILL DDR5-6000 CL36 TRIDENT Z5 RGB J 패키지 (32GB(16Gx2))", "specList": "데스크탑용 / DDR5 / 6000MHz (PC5-48000) / 램타이밍: CL36-36-36-96 / 1.35V / 램개수: 2개 / LED 라이트 / XMP3.0 / 온다이ECC / 히트싱크: 방열판 / 방열판 색상: 블랙 / LED색상: RGB / LED 시스템: AURA SYNC, MYSTIC LIGHT, RGB FUSION, POLYCHROME", "mtDate": "2022.01.", "price": 530000 }, { "id": "15462674", "thumbLink": "http://prod.danawa.com/info/?pcode=15462674&cate=11236463", "thumbImage": "//img.danawa.com/prod_img/500000/674/462/img/15462674_1.jpg?shrink=130:130&_v=20220215194029", "prodName": "APPLE 2021 맥북프로16 MK193KH/A", "specList": "41.05cm(16.2인치) / 애플(ARM) / 실리콘 M1 PRO / APL1103 / 10코어(8+2) / 운영체제(OS): macOS Monterey / 3456x2234 / DCI-P3: 지원 / 1000nit / 주사율: 120Hz / miniLED / 트루톤 / 메모리: 16GB / SSD / 1TB / 내장그래픽 / M1 PRO 16 core / 802.11ax(Wi-Fi 6) / HDMI / 웹캠(FHD) / 썬더볼트4: 3개(USB-C겸용) / USB 4.0 / SD카드 / 키보드 라이트 / 지문 인식 / 고속충전 / USB-PD / DP Alt Mode / ㅗ형 방향키 / 배터리: 100Wh / 어댑터: 140W / 충전단자: MagSafe 3 / 두께: 16.8mm / 무게: 2.1kg / 일반유통상품 / 용도: 그래픽작업용, 사무/인강용 / 색상: 그레이 / 16코어 Neural Engine / 최대 200GB/s 메모리 대역폭 / 미디어 엔진 (디코딩+인코딩+ProRes)", "mtDate": "2021.10.", "price": 3336830 } ]
javascript 에서 json 객체 가져오기
let danaw={ init:function(){ $(".danawMenu").on("click",(e)=>{ e.preventDefault(); const event=e.target const menu=$(event).attr("data-menu"); console.log(menu); this.getProduct("/api/danaw/"+menu); }); }, getProduct:function(url){ danawCrawlingProduct(url); } } danaw.init(); //다나와 크로링 제품 가져오기 파라미터 값 url function danawCrawlingProduct(url){ //로딩 시작 $("#page-loading").show(); //json 형태의 데이터를 가져온다. $.getJSON(url, function(data){ let items =[]; $.each(data, function(index, product){ //const id=product.id; const thumbLink=product.thumbLink; const thumbImage=product.thumbImage; const prodName=product.prodName; const price=commaSetting(product.price); //console.log(thumbLink, thumbLink, prodName, price); //items 배열에 등록한다. if(index<30){ items.push( ` <li class="product-list-item"> <a href="${thumbLink}" target="_blank"> <div> <img src="${thumbImage}" alt=""> </div> <span class="product-name">${prodName}</span> <span class="product-price">${price}<span>원</span></span> </a> </li> ` ); } }); //product-lis 클래스에 데이터를 넣는다. $(".product-list").html(items); if(url!=="/api/mainProducts"){ // 메인 페이지가 아니라면 하단 css 수정 const pcBest="<div class='pcw-best-shoppingmall-box'>"+$(".pcw-best-shoppingmall-box").html() +"</div>"; const footer="<footer>" +$("footer").html()+"</footer>" ; $(".pcw-best-shoppingmall-box").remove(); $("footer").remove(); $("#pcw-best").append(pcBest); $("#wrap").append(footer); let height=$(".pcw-best-seller-box").css("height").replace("px",""); //console.log(parseInt(height)+430+"px"); $("#pcw-best").css("position", "relative").css("top", parseInt(height)+450+"px"); $("footer").css("top", parseInt(height)+450+"px"); } //로딩 끝 $("#page-loading").hide(); }); } //정규식을 이용하여 3자리마다 콤마 넣기 function commaSetting(price){ return price.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','); }
출처 : 홍팍
https://www.youtube.com/watch?v=9-8aE9GonlM&list=PLyebPLlVYXCiYdYaWRKgCqvnCFrLEANXt&index=33
https://cloudstudying.kr/lectures/495https://cloudstudying.kr/lectures/495
댓글 ( 5)
댓글 남기기