스프링

 

 

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

 

about author

PHRASE

Level 60  라이트

재수가 옴붙었다 , 재수가 지독하게 없다는 말.

댓글 ( 5)

댓글 남기기

작성