반응형

 카프카는 메세지큐 서비스로 분산 환경에 특화 되있다고 한다. 보통 많이 알려진 RabbitMQ 와 동일한 메시지 큐지만 대용량 분석처리에 적합하다고 한다.

아직 ActiveMQ 밖에 사용해보지않았지만 개념으로 알아보도록하자

 

Kafka 특징 

- 분산 처리를 이용한 메세징 처리를 한다.   

  클러스터링 구조를 지원하고 단일 시스템 보다 성능이나 장애에 뛰어나며 데이터 유일이 없다.

- 시스템 확장에 용이하다. 

   분산시스템을 기반으로 설계 되었기 떄문에 확장에 아주 용이하다. 서비스를 중단하지 않고 무중단으로 확장이 가능하다. 

- 메세지를 메모리에 저장하지 않고 파일시스템에 저장한다. 

  RabbitMQ 같은 것들은 메모리에 보통 내용을 저장하고 있다가 메세지를 전송하고나면 메세지를 큐에서 삭제한다. 카프카는 데이터를 파일시스템에 저장한다. 그렇기 때문에 보관주기 안에는 메세지를 언제든지 읽어 가는게 가능하다. ( 기본 7일 ) 

- 배치 전송 처리 

  작은 메세지들은 묶어서 그룹핑 하여 처리 하여 네트워크상의 오버헤드를 줄임. 

 

Kafka 용어 

 

- Broker : 카프카가 설치된 서버 이다. 카프카 클러스터를 구성할경우 기본 1대 이상 서버들을 클러스터로 구성할수있다.

- Topic : 메세지들의 집합소이다. 프로듀서에서는 자신이 어느 토픽으로 메세지를 보낼지 정할수 있고 컨슈머는 어느 토픽에서 메세지를 가져올지 정할수 있다. 

 

- Partition : 로드 밸런싱을 위해서 토픽 자체를 분할 한다. 파티션은 하나의 프로듀서가 메세지를 전송시 여러개로 분할하여 날릴수 있는 데 메세지를 4개를 순차적으로 보내서 4초가 걸린다고 가정했을때 파티션을 4개로 파티션을 하여 전송하면 보다 빠른속도로 전송이 가능하다. ( 단, 메세지의 순서는 보장되어야한다는 제약조건이 있음. 오프셋을 사용하여 파티션  내부의 메세지를 식별함. ) 빠른 전송을 위해선 파티션이 필요하며 파티션만 늘리는것이 아니라 그수만큼 프로듀서의 수로 맞추어 늘려줘야만 제대로된 성능 효과를 볼수 있다.

 주의점은 파티션을 무한정으로 늘렸을 경우 자원낭비와 장애 발생시 복귀에 많은 자원이 소모 되므로 목표 처리량을 정해놓고 그에 맞게 설정을 해야한다.  ( 최대 파티션수는 2000개  ) 

- Replication : 브로커간의 메세지를 복사한다. 브로커중 리더가 메세지를 저장하면 리더가 아닌 다른 팔로워들이 그 데이터를 복사해서 가지고있는다. 리더에 문제가 생겼을시 다른 팔로워가 리더로 선출 되어도 동일 데이터를 들고 있기때문에 서비스에 영향이 없게 운영이 가능하다.

  ISR 을 이용하여 구성원과 리더를 구성하며 ISR 안에 속해 있어야만 리더선출 자격을 가진다. 

 

- Produce : 메세지를 카프카로 송신하는 주체 

  -   ack 설정 : 메세지 전달시 ack 설정에 따라 메세지 유실률과 처리량을 선택이 가능하다. 

      0 : ack 를 기다리지 않고 처리 , 유실률 ↑ 처리율 ↑

      1 : 리더는 데이터를 기록은 하지만 , 모든 팔로워들의 상태는 확인 하지 않음 , 유실률 - , 처리율 - 

     -1 : 모든 ISR 을 확인 함. 유실율 ↓ 처리율 ↓

  - 데이터를 보낼때 메세지 사이즈 크기와 메세지 보내기전 대기시간 , 대기 메모리량등을 프로듀서에서 설정이 가능하다. 

 

- Consumer : 메세지를 수신하는 주체 

- Apache Zookeeper : 분산 코디네이터 , 클러스트에 있는 서버들의 상태를 체크하고 분산시스템간의 정보 공유가 가능하도록 해주는 코디네이션 시스템 . 카프카 클러스터와 같으 사용시 기본적으로 주키퍼는 카프카 클러스터의 리더를 알고 있으며 시스템 구성시 카프카와 주키퍼는 다른 서버에서 구성하도록 한다. ( 주키퍼는 별도로 글을 작성 해야겠다 ) 

 

 

 

Kafka 사례 

 제일 유명한곳을 아래 두곳 같다. 국내에선  네이버나 카카오도 현재 사용중인것을 기술블로그 통해서 확인 했다. 실제 카프카 관련 서적 저자가 카카오에 계신 분인것도 확인했다. 국내에선 충분히 사용 가능할것 같고 활용도는 정말 아주 높을 것으로 보인다. 

안정성이나 성능보장성은  넷플릭스에서 서비스에 운영중이니 성능이나 안정성은 검증이 되지 않았나 싶다. 

이제 카프카를 시작한다. 카프카 단독으로도 충분히 좋은 플랫폼이라 생각하지만 적용 사례들만을 봐도 단순 카프카만으로 서비스를 하진 않는다. Spark , strom , Samza , hadoop 등 충분히 다른 플랫폼기술들과 연동이 가능하다고 본다. 단순 로그성 데이터를 수집하는것 이외에 실시간 데이터 추천이라든가 빅데이터를 수집하는 경우에도 충분히 활용하는게 가능할것 같다. 

 

'JAVA' 카테고리의 다른 글

restful API 규칙  (0) 2021.03.03
java 리스트간 비교, 값 체크  (0) 2021.02.24
RestTemplate VS WebClient  (0) 2021.02.24
비동기, 동기, 블로킹, 논블로킹  (0) 2021.02.19
JAVA11  (0) 2019.10.04
반응형

Spring 어플리케이션에서 HTTP 요청을 할 땐 주로 RestTemplate 을 사용했었습니다. 하지만 Spring 5.0 버전부터는 RestTemplate 은 유지 모드로 변경되고 향후 deprecated 될 예정입니다.

RestTemplate 의 대안으로 Spring 에서는 WebClient 사용을 강력히 권고하고 있으며 다음과 같은 특징을 가지고 있습니다.

  • Non-blocking I/O
  • Reactive Streams back pressure
  • High concurrency with fewer hardware resources
  • Functional-style, fluent API that takes advantage of Java 8 lambdas
  • Synchronous and asynchronous interactions
  • Streaming up to or streaming down from a server

Reactive 환경과 MSA를 생각하고 있다면 WebClient 사용을 적극 권장해 드리며, 기본 설정부터 Method 별 사용법까지 차근차근 알아보도록 하겠습니다.

1. RestTemplate이란?

spring 3.0 부터 지원한다. 스프링에서 제공하는 http 통신에 유용하게 쓸 수 있는 템플릿이며, HTTP 서버와의 통신을 단순화하고 RESTful 원칙을 지킨다. jdbcTemplate 처럼 RestTemplate 도 기계적이고 반복적인 코드들을 깔끔하게 정리해준다. 요청보내고 요청받는데 몇줄 안될 정도..

특징

  • 기계적이고 반복적인 코드를 최대한 줄여줌
  • RESTful형식에 맞춤
  • json, xml 를 쉽게 응답받음

 

2. RestTemplate 의 동작원리

org.springframework.http.client 패키지에 있다. HttpClient는 HTTP를 사용하여 통신하는 범용 라이브러리이고, RestTemplate은 HttpClient 를 추상화(HttpEntity의 json, xml 등)해서 제공해준다. 따라서 내부 통신(HTTP 커넥션)에 있어서는 Apache HttpComponents 를 사용한다. 만약 RestTemplate 가 없었다면, 직접 json, xml 라이브러리를 사용해서 변환해야 했을 것이다.

  1. 어플리케이션이 RestTemplate를 생성하고, URI, HTTP메소드 등의 헤더를 담아 요청한다.
  2. RestTemplate 는 HttpMessageConverter 를 사용하여 requestEntity 를 요청메세지로 변환한다.
  3. RestTemplate 는 ClientHttpRequestFactory 로 부터 ClientHttpRequest 를 가져와서 요청을 보낸다.
  4. ClientHttpRequest 는 요청메세지를 만들어 HTTP 프로토콜을 통해 서버와 통신한다.
  5. RestTemplate 는 ResponseErrorHandler 로 오류를 확인하고 있다면 처리로직을 태운다.
  6. ResponseErrorHandler 는 오류가 있다면 ClientHttpResponse 에서 응답데이터를 가져와서 처리한다.
  7. RestTemplate 는 HttpMessageConverter 를 이용해서 응답메세지를 java object(Class responseType) 로 변환한다.
  8. 어플리케이션에 반환된다.

예제

import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

public class RestTemplateTest {
	public static void main(String[] args) {
		HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
		factory.setReadTimeout(5000); // 읽기시간초과, ms
		factory.setConnectTimeout(3000); // 연결시간초과, ms
		HttpClient httpClient = HttpClientBuilder.create().setMaxConnTotal(100) // connection pool 적용
				.setMaxConnPerRoute(5) // connection pool 적용
				.build();
		factory.setHttpClient(httpClient); // 동기실행에 사용될 HttpClient 세팅
		RestTemplate restTemplate = new RestTemplate(factory);
		String url = "http://testapi.com/search?text=1234";
		Object obj = restTemplate.getForObject("요청할 URI 주소", "응답내용과 자동으로 매핑시킬 java object");
		System.out.println(obj);
	}
}

 

 

1. WebClient이란?

WebClient는 Spring5 에 추가된 인터페이스다. spring5 이전에는 비동기 클라이언트로 AsyncRestTemplate를 사용을 했지만 spring5 부터는 Deprecated 되어 있다. 만약 spring5 이후 버전을 사용한다면 AsyncRestTemplate 보다는 WebClient 사용하는 것을 추천한다. 아직 spring 5.2(현재기준) 에서 AsyncRestTemplate 도 존재하긴 한다.

기본 문법

기본적으로 사용방법은 아주 간단하다. WebClient 인터페이스의 static 메서드인 create()를 사용해서 WebClient 를 생성하면 된다. 한번 살펴보자.

@Test
void test1() {

    WebClient webClient = WebClient.create("http://localhost:8080");
    Mono<String> hello = webClient.get()
            .uri("/sample?name={name}", "wonwoo")
            .retrieve()
            .bodyToMono(String.class);

    StepVerifier.create(hello)
            .expectNext("hello wonwoo!")
            .verifyComplete();
}

@Test
void test2() {

    WebClient webClient = WebClient.create();
    Mono<String> hello = webClient.get()
            .uri("http://localhost:8080/sample?name={name}", "wonwoo")
            .retrieve()
            .bodyToMono(String.class);

    StepVerifier.create(hello)
            .expectNext("hello wonwoo!")
            .verifyComplete();
}

@Test
void test1_3() {

    WebClient webClient = WebClient.create();
    Mono<String> hello = webClient.get()
            .uri("http://localhost:8080/sample?name=wonwoo")
            .retrieve()
            .bodyToMono(String.class);

    StepVerifier.create(hello)
            .expectNext("hello wonwoo!")
            .verifyComplete();
}


@Test
void test1_3() {

    WebClient webClient = WebClient.create("http://localhost:8080");
    Mono<String> hello = webClient.get()
            .uri("/sample?name={name}", Map.of("name", "wonwoo"))
            .retrieve()
            .bodyToMono(String.class);

    StepVerifier.create(hello)
            .expectNext("hello wonwoo!")
            .verifyComplete();
}

@Test
void test1_3() {

    WebClient webClient = WebClient.create("http://localhost:8080");
    Mono<String> hello = webClient.get()
            .uri("/sample?name={name}", "wonwoo")
            .retrieve()
            .bodyToMono(String.class);

    StepVerifier.create(hello)
            .expectNext("hello wonwoo!")
            .verifyComplete();
}

@Test
void test1_3() {

    WebClient webClient = WebClient.create("http://localhost:8080");
    Mono<String> hello = webClient.get()
            .uri(it -> it.path("/sample")
                    .queryParam("name", "wonwoo")
                    .build()
            ).retrieve()
            .bodyToMono(String.class);

    StepVerifier.create(hello)
            .expectNext("hello wonwoo!")
            .verifyComplete();
}

 

'JAVA' 카테고리의 다른 글

java 리스트간 비교, 값 체크  (0) 2021.02.24
Kafka  (0) 2021.02.24
비동기, 동기, 블로킹, 논블로킹  (0) 2021.02.19
JAVA11  (0) 2019.10.04
Oracle JDK 라이센스 전환  (0) 2019.10.04
반응형

프로모션 기간이나 이벤트 기간에 유저가 폭발적으로 늘어난다면? 어떻게 처리할것인가?

 

이런 질문을 받는다면 어떻게 접근할 것인가?

  • DB I/O 를 줄이기 위해 캐시?
  • JPA 쿼리 최적화??

이렇게만 접근했다면 Spring MVC + RDBMS 개발에만 너무 한정되어 있었다고 생각한다. ( 내 얘기이다... )

물론 해당 방법으로 접근해도 개선이 되는것은 맞다.

 

Blocking I/O

 

우리가 가장 일반적으로 프로그래밍하는 모델이다. Application에서 I/O 요청을 하고 끝날때까지 Block 되어 다른 작업을 수행할 수 없다.

 

하지만 Spring Web Application 개발을 하면 Tomcat이나 Netty가 Multi Thread 기반으로 동작하기 때문에 Block 안된듯이 동작한다. 이렇게 되면 여러 개의 I/O를 처리하려면 여러 개의 Thread를 사용해야 하는데 이는 매우 비효율적이다.

 

Blocking I/O를 좀더 개선하자! Synchronous Non-Blocking I/O

 

Application에서 I/O를 요청 후 바로 return되어 다른 작업을 수행하다가 주기적으로 데이터가 다 준비 되었는지 확인을 한다. 결국 데이터의 준비가 끝나면 종료된다. 이렇게 체크하는 방식을 폴링(polling) 이라 한다. 결국 이 또한 작업이 끝날때까지 주기적으로 호출하기 때문에 불필요하게 자원을 사용하게 된다.

 

Thread 좀더 소중하게 쓰고 싶어! - Asynchronous Non-blocking I/O

 

I/O 요청을 한후 즉시 리턴된다. polling 방식과 다르게 데이터 준비가 진짜 끝났을 때 callback 을 통해 알려준다. 이전 방식 보다 좀더 효율적이긴하다!

 

자바 코드로 살펴보면, 3초 걸리는 API를 3번 호출시 Blocking I/O는 9초, Non Blocking I/O는 3초 정도 걸린다. 훨씬 효율적이긴 하지만, 그만큼의 Thread 생성으로 인하여 Context Switching 오버헤드가 존재한다!!

@Test
public void nonBlocking3() throws InterruptedException {
    final StopWatch stopWatch = new StopWatch();
    stopWatch.start();
    for (int i = 0; i < LOOP_COUNT; i++) {
        this.webClient
                .get()
                .uri(THREE_SECOND_URL)
                .retrieve()
                .bodyToMono(String.class)
                .subscribe(it -> {
                    count.countDown();
                    System.out.println(it);
                });
    }

    count.await(10, TimeUnit.SECONDS);
    stopWatch.stop();
    System.out.println(stopWatch.getTotalTimeSeconds());
}

 

Context Switching 오버헤드도 해결하자! - Event Driven

Spring Framework 에서 Blocking I/O -> Non Blocking I/O 해결 과정

아래 그림에서 왼쪽은 non-blocking I/O를 이용해서 많은 양의 동시성 연결을 다룰 수 있는 Reactive Stack이고, 오른쪽은 blocking 방식의 Servlet Stack이다.

 

Spring MVC

아래 그림처럼 클라이언트로부터 요청이 들어오면 Queue를 통하게 된다. 스프링 어플리케이션은 요청당 Thread 한개가 할당된다. ( One Request Per Thread Model ) 즉, Thread Pool이 수용할 수 있는 요청까지만 동시적으로 작업이 처리되고 만약 넘게 된다면 큐에서 대기하게 된다.

 

Thread 생성 비용은 크기 때문에 미리 생성하여 재사용함으로써 효율적으로 사용한다. 서버 성능에 맞게 Thread 최대 수치를 제한 시키는데, tomcat 기본 사이즈는 200이다.

 

즉, thread pool size 200을 지속적으로 초과하게 된다면, Queue에서 계속 대기하게 된다. 전체 대기시간이 늘어나게 되는데 이런 현상을 Thread Pool Hell 이라 한다. 아래 그림은 링크드인의 Thread pool hell 현상에 대한 그래프이다. Thread pool 감당 사이즈를 넘는 요청이 들어오는 순간부터 수배나 많은 지연시간을 보여준다.

 

하나의 작업이 늦게 처리되는 부분은 DB, Network 등의 I/O가 일어나는 부분에서 많은 시간이 소비된다. I/O작업은 CPU가 관여하지 않는다. I/O를 가장 효율적으로 처리할 수 있는 방식이 Spring에서 제공해주는 WebFlux이다.

 

Spring WebFlux

 

 

위 그림은 WebFlux 구조에 대한 그림이다. 요청별로 Thread를 생성하는 것이 아니라, 다수의 요청을 적은 Thread로 처리를 한다. Worker Thread 기본 사이즈는 서버의 Core 개수로 설정이 되어있다. 즉 core 수가 4개라면 4개의 Thread로 대용량 트래픽을 감당한다는 것인가? ( Node.js에서 본 아키텍처이다... )

 

이렇게 Non Blocking 방식을 활용하면 효율적인 I/O 제어가 되어 성능이 향상될 수 있다. 그래서 MSA에서 네트워크 호출이 많기 때문에 적용하기 좋다. 하지만!! I/O 작업 중 하나라도 Blocking 방식이 있다면, 결국 Blocking이 발생되기 때문에 4개의 Thread 이후 요청은 결국 대기를 해야한다.

 

위와 관련된 예가 DB connection 일 것이다. 아무 생각없이 blocking 되는 DB connection을 넣어놓고 나머지는 non-blocking 방식으로 구현했다면 문제가 발생한다. MongoDB, Redis 등의 NoSQL은 non-blocking db connection을 지원한다고 한다!

 

와 그러면 무조건 WebFlux로 성능도 챙기고, 개발도 멋있게 하자?

 

당 그림을 보면 Spring MVC와 Spring WebFlux 성능이 비슷한 구간이 있다. 서버의 성능이 좋아진다면 비슷한 구간이 더 늘어날 것이다.

 

Spring Document에서 조차도 동기 방식이 코드 작성, 이해, 디버깅 하기가 좋다고 한다. ( 나만 그런게 아니였어... ) 결국 생산성 측면에서는 동기 방식 코딩이 훨씬 높기 때문에 서비스 규모나 서버의 성능에 따라 잘 따져보아야 한다.

 

왜 성능이 동일한 구간이 생길까?
위의 그림에서 Concurrent Users가 1000명 이하일때는 Thread Pool이 감당할 수 있는 정도의 요청이었기 때문이다. 이후에는 Queue에 쌓여 점점 성능이 느려진것이다.

WebFlux 간단한 예제 코드

@SpringBootApplication
@EnableWebFlux
public class ExampleApplication {
 
    @Bean
    HelloHandler helloHandler() {
        return new HelloHandler();
    }
 
    @Bean
    RouterFunction<ServerResponse> helloRouterFunction(HelloHandler helloHandler) {
        return RouterFunctions.route(RequestPredicates.path("/"), helloHandler::handleRequest);
    }
 
    public static void main(String[] args) throws Exception {
        SpringApplication.run(ExampleApplication.class);
    }
}

public class HelloHandler {
    public  Mono<ServerResponse> handleRequest(ServerRequest serverRequest) {
        return ServerResponse.ok().body(Mono.just("Hello World!"), String.class);
    }
}

 

참고

happyer16.tistory.com/entry/%EB%8C%80%EC%9A%A9%EB%9F%89-%ED%8A%B8%EB%9E%98%ED%94%BD%EC%9D%84-%EA%B0%90%EB%8B%B9%ED%95%98%EA%B8%B0-%EC%9C%84%ED%95%9C-Spring-WebFlux-%EB%8F%84%EC%9E%85

 

 

 

 

 

 

 

 

 

 

 

반응형

#!/bin/sh

SERVICE_HOME=/home1/irteam/service/tube-web
SERVICE_JAR=tube-web_real.jar
DATE2=`date +%Y%m%d`

cd $SERVICE_HOME/patch

if [ -f "$SERVICE_JAR" ];then
echo '[SERVICE] SERVICE Stop...'
cd $SERVICE_HOME/bin
./stop.sh

##프로세스 상태를 체크한다...
checkCount=1
while [ "$checkCount" != "0" ]
do
checkCount=$(ps -ef | grep $SERVICE_JAR | grep -v grep | wc -l)
echo "프로세스 종료 진행 중"
sleep 2;
done


echo '[SERVICE] '$SERVICE_JAR' backUp..'
cd $SERVICE_HOME/jar

SERVICE_JAR_BACK=$SERVICE_JAR'.'$DATE2
if [ -f "$SERVICE_JAR_BACK" ];then
COUNT=$(ls | grep $SERVICE_JAR_BACK | wc -l)
cp $SERVICE_JAR $SERVICE_JAR_BACK'_'$COUNT
echo '[SERVICE] backUp File : '$SERVICE_JAR_BACK'_'$COUNT
else
cp $SERVICE_JAR $SERVICE_JAR_BACK
echo '[SERVICE] backUp File : '$SERVICE_JAR_BACK
fi

echo '[SERVICE] '$SERVICE_JAR' patch!!'
mv $SERVICE_HOME/patch/$SERVICE_JAR $SERVICE_HOME/jar/$SERVICE_JAR
sleep 1;
echo '[SERVICE] SERVICE Start !!'
cd $SERVICE_HOME/bin
./start.sh
else
echo "patch File not exist"
echo $SERVICE_HOME"/patch 파일이 없습니다. 패치가 진행될 JAR파일이 필요합니다."

fi

 

해당 스크립트는

SERVICE_HOME의 patch 디렉토리에 해당 SERVICE_JAR를 넣으면 패치를 진행해줍니다.

해당 프로세스는

1) SERVICE_HOME의 서비스 종료

2) 해당 프로세스가 종료되었는지 체크(2초간격)

3) SERVICE_HOME의 SERVICE_JAR파일 백업
: 만약 tube-web_alpha-internal.jar.20200407 과 tube-web_alpha-internal.jar.20200407_1 이 있을 경우 tube-web_alpha-internal.jar.20200407_2 로 백업을 진행해줍니다.

4) 해당 Patch 디렉토리의 JAR파일 변경

5) 서비스 시작

 

해당 스크립트를 사용하기위해서는 

SERVICE_HOME, SERVICE_JAR의 값을 변경후 진행하시면됩니다.

patch 디렉토리 생성이 필요합니다.

 

 

'Server' 카테고리의 다른 글

mac 포트 확인, kill  (0) 2022.06.29
Mac 단축키 변경  (0) 2021.08.24
Apache AJP 통신 문제에 따른 조치방안  (0) 2020.11.11
cat , tail 명령어 정리  (0) 2019.09.16
리눅스 Tar 압축, 풀기  (0) 2016.08.09
반응형

해당 데이터는 URL html 소스를 가져와 <script> 의 JSON 값을 가져와서 추출

1.네이버쇼핑 크롤링

URL : https://search.shopping.naver.com/search/all?query=청바지&cat_id=&frm=NVSHATC

컬럼 스탭1컬럼 스탭2비고

rank   쇼핑물품 랭킹순위

광고일 경우 그 상품의 실제 랭킹이 나오는것으로 판단
예) rank : 7 이지만 맨 상단에 존재함.

adId   광고 상품 ID

광고일 경우에만 존재함.

예) nad-a001-02-000000043848044

id   상품 ID (81164854575)
productTitle   상품 이름(제목)  
mallName   쇼핑몰 명 쇼핑몰리스트가 있을경우 Null
mallNo   쇼핑몰 고유번호 쇼핑몰리스트가 있을경우 Null
price   가격  
maker   제조사 예) 나이키
brand   브랜드  
category1Id   카탈로그 1 ID  
category2Id   카탈로그 2 ID  
category3Id   카탈로그 3 ID  
category4Id   카탈로그 4 ID 대부분 3까지 존재함.
category1Name   카탈로그 1 이름  
category2Name   카탈로그 2 이름  
category3Name   카탈로그 3 이름  
category4Name   카탈로그 4 이름 대부분 3까지 존재함.
imageUrl   해당 이미지 URL  
adcrUrl   해당 상품 접속 URL

광고 일 경우 해당 값으로 전달됨.

해당 URL은 스마트스토어, 및 구분이 되지는 않음.

mallProductUrl   해당 상품 접속 URL

일단 상품일 경우 해당 값에 URL이 나옴.

스마트스토어 인지 판단 가능.

lowMallList   쇼핑몰 리스트 Null 일경우 해당 쇼핑몰 정보(malllnfoCache) 가 존재.
mallInfoCache   쇼핑몰 정보 lowMallList 가 있을 경우 mallInfoCache 데이터가 생성됨.
  seq   쇼핑몰 고유번호와 동일 (mallNo)
  prodCnt   해당 쇼핑몰의 상품 판매갯수
  bizplBaseAddr   쇼핑몰 주소
  businessNo   쇼핑몰 비니지스 고유번호

 

 

{
	"props": {
		"initialState": {
			"pageProps": {
				"products": {
					"list": [
						{
							"item": {
								"collection": "product",
								"purchaseConditionInfos": null,
								"rank": "1",
								"adId": "nad-a001-02-000000029084315",
								"id": "80067642166",
								"parentId": "12084409008",
								"productTitle": "[28-42] 가을 남자청바지 일자 스판 워싱진 58종 연청 블랙진 9부 컷팅진 빅사이즈",
								"mallName": "핫코드",
								"isBrandStore": "0",
								"isNaverPay": "1",
								"isMblNaverPay": "1",
								"nPayPcType": "2",
								"nPayMblType": "2",
								"saleTp": "0",
								"mallInfo": "0",
								"coordiScr": "1",
								"isCoordiCtg": "1",
								"isAdult": "0",
								"hasVideo": "0",
								"isHotDeal": "0",
								"purchaseCnt": "5179",
								"mblSimImgSgntCnt": "1",
								"priceUnit": "KRW",
								"tvProdInfo": "^^",
								"mobileLowPrice": "17900",
								"mallProductId": "2569898604",
								"imgColorCd": "16385",
								"lowPrice": "17900",
								"price": "17900",
								"dummy": "2020-11-10 14:59:53",
								"imgSgnt": "12647599125737729913563161344",
								"demography": "@@",
								"lstRcvYmdt": "20201110",
								"checkOutReviewCount": "0",
								"mallNo": "233788",
								"category2Name": "남성의류",
								"descriptionOrder": "C12003|RV",
								"category2Id": "50000169",
								"category1Id": "50000000",
								"category3Id": "50000835",
								"category1Name": "패션의류",
								"imgVersion": "5",
								"prchCondInfo": "||||||",
								"highPrice": "0",
								"naverPayAccumRto": "0.0",
								"imageUrl": "https://shopping-phinf.pstatic.net/main_8006764/80067642166.5.jpg",
								"isLgtModelMat": "1",
								"category3Name": "청바지",
								"hasLowestCardPrice": "0",
								"openDate": "20180307021509",
								"displayNx": "1",
								"mobilePrice": "17900",
								"isExceptedBest100": "0",
								"categoryPlusId": "5000000050000169",
								"manuTag": "남자청바지,남성청바지,스판청바지,일자청바지,가을신상,찢어진청바지",
								"additionalImageCount": "9",
								"reviewCountSum": "12286",
								"mallCount": "5",
								"mallId": "hotcode",
								"reviewCount": "12286",
								"productName": "[28-42] 가을 남자청바지 일자 스판 워싱진 58종 연청 블랙진 9부 컷팅진 빅사이즈",
								"demoBM": "33024",
								"prodTp": "1",
								"mpTp": "2",
								"dlvryCont": "0||^^택배^^^^2500^5000^^",
								"overseaTp": "0",
								"imgSz": "600x600",
								"dlvryCd": "1",
								"isAddExps": "1",
								"isMisImg": "0",
								"chnlSeq": "500053452",
								"wdTp": "0",
								"attributeValue": "하의기장|하의핏|신축성|밑위|워싱|성별",
								"hasCouponContent": "1",
								"shopNNo": "233788",
								"deliveryFeeContent": "0",
								"buyPointContent": "^279^279^^^0^0",
								"hasEventContent": "0",
								"characterValue": "긴바지|슬림핏|신축성있음|기본허리선|다크블루|남성용",
								"characterValueSeqs": "M10258087 M10040058 M10732771 M10040025 M10040011 M10029065",
								"simImgSgntCount": "1",
								"attributeValueSeqs": "10013413 10011007 10013416 10011010 10011008 10005212",
								"hasBuyPointContent": "1",
								"hasCardContent": "0",
								"couponContent": "11000원^^^",
								"hasDeliveryFeeContent": "1",
								"naverAnalyticsAccountId": "s_7a614a8a13bb8981",
								"adcrUrl": "https://adcr.naver.com/adcr?x=KOZHLjpH4WMO6R3NE7ixJf///w==k02c3WV4ITM4ot4oupp9S5gPygY38bq+kyrNbNmSHa4DWxVLlemCSGrqsb41RHxujfaULigLzAD2RFKY0DfKKudobvRMEkwgC9EGa0KKOXczq3gd4JXAiXx9+wGUGRYP/ExcY9DipmmGTo1InhUQY8O8roHDZY3gOThmXtZCV3YSckbdsGw2S6mu2C7V+p9/K+MZvrlvwMcq0AFmBlJf0w1yEa4UFz2NH5z0G7QS9CCrWqpEm/6MSGf9eSlNJGCs2BUpsbypLboxsXTqyptgJJun0FhPAYEpel4+zWafQ6Nr1XnsueH1OBqlQh9/s4GY7zgf7SDtYSpfZDm2tB0IlcWWOuJV5O2N5YnDrSL2VYNUtfVwXjm0+stvS05mNDgUglQnu+ZTw8jw8/ng0dxwBEXnwg7vIGMz6auDYpTXd+5eY7ESSUVhvC5xrspXc45RO7rPxW+9ifL1R6DjU8XXXMJUlx6DQt7CTr/7fLFuk2IgTf7sMcoGLHbP67YlLatpJ6lyHuqFiZkqPuR3JBWmwqQlT9BMfCkSJFMcglFCJhVnd6L1BbLI4tK24OOGNNKR73On3zIzFp9kbJIfmuzExfoxfmJQVkRpRLrf4/POhuuQBo+FkMVrlAsUuuZHbvDFj/OMdVEqMpeXcbtpdfrvEhlzt0MAyj7Qys3RA34OIhBp2yGg8tT3UM+IuE7WYM5vY/pdhWY7iUCBJ+hSDpUrFyqkP0mAPoTPOroua8lGwWtxrTkCnRLoZM1wdDkLGMaoO",
								"naverPayAdAccumulatedType": "1",
								"naverPayAdAccumulatedValue": "2",
								"naverPayAdAccumulatedDisplayValue": "포인트 637원",
								"adAdditionalDescription": "2장이상 사은품제공",
								"adAdditionalLongDescription": "핏이예쁜 남자청바지 / 사은품제공!",
								"adProductInfoEnabled": "true",
								"lowMallList": null,
								"mallInfoCache": {
									"seq": "233788",
									"prodCnt": "780",
									"name": "핫코드",
									"bizplBaseAddr": "부산광역시 부산진구 가야대로703번나길  16 3층 (우 : 47262) ",
									"bizplDtlAddr": null,
									"businessNo": "2388800340",
									"onmktRegisterNo": "2016-부산부산진-0084",
									"mallIntroduction": "겨울 신상 대량 입고! 기모청바지, 후리스 점퍼, 셔츠, 면바지, 슬랙스 ★빅사이즈 완벽!",
									"mallLogos": {
										"MALL": "https://ssl.pstatic.net/imgshopping/mallimg/logo/flash/233788_1398821887135.jpg",
										"REPRESENTATIVE": "https://shop-phinf.pstatic.net/20190806_92/hotcode_1565071320171HJ1Mm_JPEG/2433653753741770_1813386582.jpg",
										"FORYOU": "https://shopping-phinf.pstatic.net/20201109_9/7ebdea28-e30f-42e7-8a4c-aac5557de5d9.jpg"
									},
									"mallGrade": "M44003",
									"goodService": false,
									"talkAccountId": "wcctbs",
									"eventScheduledCont": null,
									"adsrType": "SHOPN",
									"naverPay": true
								},
								"channelInfoCache": {
									"talkAccountId": "wcctbs"
								}
							},
							"type": "product"
						},
						{
							"item": {
								"collection": "product",
								"purchaseConditionInfos": [
									{
										"seq": "",
										"condition": "",
										"count": "",
										"lowPrice": "",
										"highPrice": "",
										"unitPrice": "",
										"unit": "",
										"crUrl": "https://cr.shopping.naver.com/adcr.nhn?x=T%2FmuOY27D6fmOc9Zwe8Vmf%2F%2F%2Fw%3D%3DsbR8uIs10lNqtrhfovAHiPJKmu1QZJl3onYxYl%2F%2FYv5VLVSlAW5fWUPF%2Bxeno1sOrR9cDHmEZ%2FDiUJueCJR3K%2Bet7ZsVUZ%2BndCF3Ym3%2F4KRSOuHGPyXtEeLz8ccDcAe092M3yhuL7EojkjtlKdOo6AEPg%2F6PYJW9LpCSumzPJoiiKl6jgnMWqWbL3KWH9FLwd%2FVQYtPTsGZJyV6XLZrtYKtTPPQ000E2blvdaoXHHZ%2FbTbhMjZ0fzZdJ0cCBsJnDP9wGiUI9IPy%2FxGWOMgJoU4VIy8bcCpvU4AZbY917gAFhk9nGdOHu6Gy8Co48pX%2FN8VhF3l8Emrmz7tKlGsUHzz2vqR2unsG9Pw6XBns%2FftjJmn%2B6FVZ%2Fm0w7K7lHYQAO7I4MNg7%2BxnF1jRCL%2FSJihdFC8IvS%2BNPsEPJ7D6mlNi%2F4PgpHJTXjMieq3hjbDds0NxljVGIg7TKBvjtCOSaUDTktdy%2F0DPgmbquq6SjnyPoNN46TQ2dghVCriodEieIR%2B1hPzLpnIjjlrmZrp8rfzj8NO5ayMnVL5IPnB0ZmLvjG7A%2F0vSPti8cHY4o2fastw%2FK1lEyP7SEOAeJJyMwyuVXpv03UpAbWMK%2BW6UOHFvWmP9ozmdV%2FWs5eTR9VTjChbTXubC0gxTydB2KDV1dF8S3yPyMyOJTEECDo5gHoUtzCCqA6%2BrrPkSkQjk3bFq%2FUy&nvMid=21616007059&catId=50000835"
									}
								],
								"rank": "2",
								"docid": "127000313743",
								"id": "21616007059",
								"parentId": "21616007059",
								"hasModelNameSearch": "0",
								"hasLowestCardPrice": "0",
								"isExceptedBest100": "0",
								"displayNx": "1",
								"hasPromotionCont": "0",
								"hasAddInFee": "0",
								"scoreInfo": "4.5",
								"category1Id": "50000000",
								"category2Id": "50000169",
								"category3Id": "50000835",
								"category4Id": "",
								"categoryPlusId": "5000000050000169",
								"category1Name": "패션의류",
								"category2Name": "남성의류",
								"category3Name": "청바지",
								"category4Name": "",
								"category4NameOrg": "",
								"categoryLevel": "3",
								"openDate": "20191227172146",
								"maker": "",
								"makerNo": "0",
								"brand": "",
								"brandNo": "0",
								"series": "",
								"seriesNo": "0",
								"attributeValueSeqs": "10013413 10011007 10013416 10011010 10011008 10005212",
								"attributeValue": "하의기장_P|하의핏_P|신축성_P|밑위_P|워싱_P|성별_A",
								"characterValueSeqs": "M10258087 M10040058 M10732771 M10040025 M10040011 M10029065",
								"characterValue": "긴바지|슬림핏|신축성있음|기본허리선|다크블루|남성용",
								"productName": "남자 겨울 기모청바지 스판 7종",
								"productTitle": "남자 겨울 기모청바지 스판 7종",
								"productTitleOrg": "남자 겨울 기모청바지 스판 7종",
								"description": "",
								"descriptionOrder": "C12003|RV",
								"searchKeyword": "",
								"lowPrice": "17800",
								"highPrice": "17900",
								"mobileLowPrice": "17800",
								"screenFlag": "M63001",
								"price": "17800",
								"mobilePrice": "17800",
								"priceUnit": "KRW",
								"lowestCardPrice": "",
								"lowestCardName": "",
								"reviewCount": "2147",
								"checkOutReviewCount": "0",
								"reviewCountSum": "2147",
								"day14ReviewCount": "4",
								"monthReviewCount": "4",
								"yearReviewCount": "4",
								"imageUrl": "https://shopping-phinf.pstatic.net/main_2161600/21616007059.20191228034111.jpg",
								"additionalImageCount": "9",
								"mallCount": "4",
								"mallNo": "0",
								"mallId": "naver_model",
								"mallName": "",
								"mallNameOrg": "",
								"mallProductId": "",
								"mallProductUrl": "",
								"mallProdMblUrl": "",
								"mallPcUrl": "",
								"mallSectionNo": "0",
								"isBrandStore": "0",
								"isNaverPay": "0",
								"isMblNaverPay": "0",
								"nPayPcType": "0",
								"nPayMblType": "0",
								"naverPayAccumRto": "0",
								"atmtTag": "넉넉한,워싱이예쁜,핏이좋은",
								"manuTag": "",
								"preferTag": "\n38489\t0m3\n38145\t0m2",
								"purchaseCnt": "0",
								"smryReview": "630273734-hotcode-2228321840`/`소재`/`기대한 만큼 좋은 재질과 다자인이어서 참 마음에 듭니다`/`seung***`/`5`/`20190201`|`516721335-hotcode-2390605677`/`색상`/`청바지 색상이 생각했던거보다 너무 마음에 듭니다`/`adhjy0***`/`5`/`20181022`|`802767275-hotcode-2228321840`/`라인`/`핏하고 스판하고 등등 다 좋았습니다`/`dir***`/`5`/`20200219",
								"isHotDeal": "0",
								"demoBitMask": "",
								"tvProdInfo": "^^",
								"isLgtModelMat": "0",
								"lnchYm": "20191227",
								"modelImgUrlList": "https://shopping-phinf.pstatic.net/main_2161600/21616007059.1.20191228034111.jpg,https://shopping-phinf.pstatic.net/main_2161600/21616007059.2.20191228034111.jpg,https://shopping-phinf.pstatic.net/main_2161600/21616007059.3.20191228034112.jpg,https://shopping-phinf.pstatic.net/main_2161600/21616007059.4.20191228034112.jpg,https://shopping-phinf.pstatic.net/main_2161600/21616007059.5.20191228034112.jpg,https://shopping-phinf.pstatic.net/main_2161600/21616007059.6.20191228034112.jpg,https://shopping-phinf.pstatic.net/main_2161600/21616007059.7.20191228034113.jpg,https://shopping-phinf.pstatic.net/main_2161600/21616007059.8.20191228034113.jpg,https://shopping-phinf.pstatic.net/main_2161600/21616007059.9.20191228034113.jpg",
								"keepCnt": "22",
								"lstRcvYmdt": "",
								"prchCondInfo": "||||||",
								"lowestPrcScrnTpList": "",
								"exchangeRateInfo": "",
								"modelCreTpCd": "M98003",
								"mpTp": "0",
								"overseaTp": "0",
								"saleTp": "0",
								"prodTp": "1",
								"wdTp": "0",
								"wdNm": "",
								"comNm": "",
								"imgSz": "640x640",
								"isChnlPnt": "",
								"chnlSeq": "",
								"mnQry": "",
								"demoBM": "34816",
								"mallInfo": "0",
								"isMisImg": "0",
								"coordiScr": "0",
								"isCoordiCtg": "1",
								"isAddExps": "",
								"dlvryCd": "0",
								"dlvryCont": "||",
								"isAdult": "0",
								"isAdultExpsRstct": "0",
								"videoId": "",
								"hasVideo": "0",
								"gdid": "00000009_0005086a1793",
								"deliveryFeeContent": "",
								"diffDeliveryFeeContent": "",
								"hasDeliveryFeeContent": "0",
								"eventContent": "",
								"hasEventContent": "0",
								"couponContent": "^^^",
								"hasCouponContent": "0",
								"cardContent": "",
								"hasCardContent": "0",
								"buyPointContent": "^^^^^0^0",
								"hasBuyPointContent": "0",
								"simImgSgntCount": "1",
								"mblSimImgSgntCnt": "1",
								"imgColorCd": "16385",
								"imgSgnt": "12471058266187901063589266202",
								"imgVersion": "20191228034111",
								"lowPriceByMallNo": "12456043574/233788/2228321840/17800/500053452",
								"shopNNo": "0",
								"newNormHit2": "0.2550",
								"dummy": "",
								"lowMallList": [
									{
										"nvMid": "12456043574",
										"mallSeq": "233788",
										"mallPid": "2228321840",
										"price": "17800",
										"chnlSeq": "500053452",
										"chnlType": "STOREFARM",
										"chnlName": "핫코드",
										"chnlNaverPay": true,
										"naverPay": true,
										"naverPayType": "NaverPayPlus",
										"name": "핫코드",
										"windowType": null
									}
								],
								"crUrl": "https://cr.shopping.naver.com/adcr.nhn?x=jJIgX%2FJ8yvOaGXpU%2F7ry6v%2F%2F%2Fw%3D%3DsltCxBY80ihGkkvGnR1mevDgpj1Vva5pxgcTfFOH%2FFYvGOx0NH2MA0a0so8ygH1CngklGUmTE84AQ9OPEqL1JmSRqK2FgjEIKDsdrBCfcPplQhBQnvnTO%2FiL0%2BodejYTLDmMjdP4Jlf32gJppkyiGbcv%2BjB2erv%2BZ%2Brrs5VHOiTRp8VhOdW8Gk%2Bhilsry7l0ddS6sP4tk69pyhfWAWRqCIdKgFLrc0RujVMjtoF1odKBYcRhBtdpYEzxCF9LebWmf0T2FLYXjZU1TovAmiALtFrjPEecLuOr5afmUZ6VJvj6GZ5a0ma%2FDwz3QQr7PLlrXJV03cukp%2F9sq6JmLvPVclP%2FpGvkkSfy%2B9FDy4mOYmRLR4gcB1s3LP%2Bj7Bmnmb5FUV36ogsAbT2GMBHUreotiQNqfv5UIdnjAgW%2BMfJ3%2FWzPCAJZRSh0vWdUgukqZpYphsPOfdzkfq%2BKsVKCdbkop2i1De7HCYOj7L1Lz129xw3b3CMQn9jRfOifsUnx9TIywmPYCwUw9SaE4z6W4A2fP2aq5JZVOONqISqd0x3Y6M2nT1mpfwCuiTZnxUPsMzspqT8AlxSYkXaLH96LNyv1p9ds%2B7nwUHUA7fz23ojqZXcMzvNOOz9Z2Oy37PPg8ubTUA35CyMrpXQUt3%2FJvHupy5s1ITc7NlRPvorKrNyQBKaY%3D&nvMid=21616007059&catId=50000835",
								"crUrlMore": "https://cr.shopping.naver.com/adcr.nhn?x=K94OrrmOkOu6F6sCiGNNlv%2F%2F%2Fw%3D%3Ds%2BL0lXfQKcXjJowSinqwI29u63M%2FLAjyIbmFzPJFUGWSwZeGnRgxnttveusjCcK4GWQIcDpgaeQ6iro6JEeUQ4cY8rD1JbA70On9XGkhEASp8vlEkCVsU0TwYALL8V76nR4lxSarKwF2Hbi3RRu8K0oBsJjzV%2F3vl5Lmd9HbkUGKmuJVM1QU1cDigHCsm0Q2kWbmz6dU%2B2EUMU2Bt95WhhQO1enscnNzFI3MMi5X3vfOWsE%2FC1OtgGk6xFkOq7gk7qiuJLOcie23pxt6BM6v7dNNiuJmluM%2Fzo51Pc3Ba5ZQ7%2Blbv6UeDOC2o2x4M6Poaw6ZjbtkbN7RD61dGUzg7G1qsmhWtsS26cBgiQoajA6o8GNcxpLpESuE%2FjrFliDy8ISFv7n5uAItYPm5%2BaPBVoHwnZ5vnzg8PFKHdN%2B9rFixvWhM8ooFahBTiEMt6qHvIoCF9uZFzpP1D3UyqhUgjqtbhtb7yQG5KW7%2B14KhuFJpWweTggCoEP%2F%2BHgZQwj2GT5Wl%2FifVOC1YDK3Bb0bH3g19T4KoDZhG5av2gq%2FRJz4eRNMQOfpqT7a2tyR5fbmKwQbS1cZ12ZIi4smp%2B8g4CohLPHBVE1X9hF6ZkrnPWwITM8qr0Q5vXsi0b8%2Bu6wUxet%2BeTHbvgRwccIZ2LNtxnaGhopkeKUdu5q4dSKA0zkoA%3D&nvMid=21616007059&catId=50000835"
							},
							"type": "product"
						},
						{
							"item": {
								"collection": "product",
								"purchaseConditionInfos": [
									{
										"seq": "",
										"condition": "",
										"count": "",
										"lowPrice": "",
										"highPrice": "",
										"unitPrice": "",
										"unit": "",
										"crUrl": "https://cr.shopping.naver.com/adcr.nhn?x=%2FCAW0jGoIM6JSyWFByprKP%2F%2F%2Fw%3D%3DsGphTR1EL7Iwc8D8NK%2BIn8WAlDLbbSk91ljv0yV%2FosrewZeGnRgxnttveusjCcK4GguyHLINtn2UZHsXvvfYQo8Y8rD1JbA70On9XGkhEASp8vlEkCVsU0TwYALL8V76nVpcCviPnRbZaxpidblYoWea0O2TX7GIDZW3de8vjU8yM3JWD%2BN0BB%2B9Exhu6fPryYQaM84jUGvXvh5gLv9Hm8UAj5vRFoOOdkigWXY8zhWmzmxj35sRQYluc1SrUJCw0SACfyUPb7GuBuWsGpjA91YrHsbeStsmJBfOvK7DA6okzAjWnVz5H8U2dshPC%2FHnKcG1awZthlDycUb175VysKn%2BUucnAxrsG3xHb9QOpCsJrR6puFRwx1J4Q4na%2BuwxM%2Fgmn9UWZ08Lu4vkhY3i2SBBYlbe18EfHbpSZmErndiyfLB440SYO1Cnk2bZ9BBPMrRsw2T1COAB3adgWpOQwMLTdcfGoFDbEgjZ9Qvt%2Fw50u%2FC86tDTe8A7VZgPIsttfLpZWN8skLy7TACK%2FKVvF9RrMKwZ6k3Cnv%2FmFpKn6BYPnlfMTIBWjuKvu5954syqo1g13VDxd5QBEZGpRgYgS%2BJw2pu7UAGtr%2BOajr5K2lK99Y9s3NC3X30JyNTTwr4NHAqFYP8YZgDWVRhWoVvk9uwN%2BQsjK6V0FLd%2Fybx7qcubNSE3OzZUT76KyqzckASmm&nvMid=81729819800&catId=50000835"
									}
								],
								"rank": "3",
								"docid": "9003041347",
								"id": "81729819800",
								"parentId": "81729819800",
								"hasModelNameSearch": "0",
								"hasLowestCardPrice": "0",
								"isExceptedBest100": "0",
								"displayNx": "1",
								"hasPromotionCont": "0",
								"hasAddInFee": "0",
								"scoreInfo": "",
								"category1Id": "50000000",
								"category2Id": "50000169",
								"category3Id": "50000835",
								"category4Id": "",
								"categoryPlusId": "5000000050000169",
								"category1Name": "패션의류",
								"category2Name": "남성의류",
								"category3Name": "청바지",
								"category4Name": "",
								"category4NameOrg": "",
								"categoryLevel": "3",
								"openDate": "20200117150705",
								"maker": "게스",
								"makerNo": "1584",
								"brand": "게스",
								"brandNo": "1326",
								"series": "",
								"seriesNo": "0",
								"attributeValueSeqs": "10013413 10011007 10013416 10011010 10011008 10005212",
								"attributeValue": "하의기장|하의핏|신축성|밑위|워싱|성별",
								"characterValueSeqs": "M10258087 M10040005 M10732771 M10040025 M10040011 M10029065",
								"characterValue": "긴바지|일자핏|신축성있음|기본허리선|다크블루|남성용",
								"productName": "게스 남자 청바지 일자핏 슬림핏 스판진 데님 미디엄블루진 연청 블랙진",
								"productTitle": "게스 남자 청바지 일자핏 슬림핏 스판진 데님 미디엄블루진 연청 블랙진",
								"productTitleOrg": "게스 남자 청바지 일자핏 슬림핏 스판진 데님 미디엄블루진 연청 블랙진",
								"description": "",
								"descriptionOrder": "C12003|RV",
								"searchKeyword": "",
								"lowPrice": "49860",
								"highPrice": "0",
								"mobileLowPrice": "49860",
								"screenFlag": "",
								"price": "49860",
								"mobilePrice": "49860",
								"priceUnit": "KRW",
								"lowestCardPrice": "",
								"lowestCardName": "",
								"reviewCount": "1369",
								"checkOutReviewCount": "0",
								"reviewCountSum": "1369",
								"day14ReviewCount": "56",
								"monthReviewCount": "134",
								"yearReviewCount": "1160",
								"imageUrl": "https://shopping-phinf.pstatic.net/main_8172981/81729819800.8.jpg",
								"additionalImageCount": "5",
								"mallCount": "0",
								"mallNo": "788563",
								"mallId": "ncp_1nohy9_01",
								"mallName": "ENJOY PANDA",
								"mallNameOrg": "ENJOY PANDA",
								"mallProductId": "4185298384",
								"mallProductUrl": "https://smartstore.naver.com/main/products/4185298384",
								"mallProdMblUrl": "https://m.smartstore.naver.com/main/products/4185298384",
								"mallPcUrl": "https://smartstore.naver.com/enjoy_panda",
								"mallSectionNo": "10",
								"isBrandStore": "0",
								"isNaverPay": "1",
								"isMblNaverPay": "1",
								"nPayPcType": "2",
								"nPayMblType": "2",
								"naverPayAccumRto": "0",
								"atmtTag": "노멀한,밑단이예쁜,워싱이예쁜|스포티한",
								"manuTag": "청바지코디,데일리코디,데일리코디룩,스판청바지,남자스판청바지,남자청바지,남자청바지핏,남성청바지,겨울기모청바지,기모청바지",
								"preferTag": "\n35737\t0m5\n31863\t0m3\n27152\t0m2\n29407\t0m4",
								"purchaseCnt": "1577",
								"smryReview": "",
								"isHotDeal": "0",
								"demoBitMask": "",
								"tvProdInfo": "^^",
								"isLgtModelMat": "0",
								"lnchYm": "",
								"modelImgUrlList": "",
								"keepCnt": "527",
								"lstRcvYmdt": "20201110",
								"prchCondInfo": "||||||",
								"lowestPrcScrnTpList": "",
								"exchangeRateInfo": "",
								"modelCreTpCd": "",
								"mpTp": "1",
								"overseaTp": "0",
								"saleTp": "0",
								"prodTp": "1",
								"wdTp": "0",
								"wdNm": "",
								"comNm": "",
								"imgSz": "1000x1000",
								"isChnlPnt": "",
								"chnlSeq": "100267387",
								"mnQry": "enjoypanda",
								"demoBM": "34816",
								"mallInfo": "0",
								"isMisImg": "0",
								"coordiScr": "0",
								"isCoordiCtg": "1",
								"isAddExps": "",
								"dlvryCd": "2",
								"dlvryCont": "3000||오늘출발^11:30^택배^^^^3000^6000^^",
								"isAdult": "0",
								"isAdultExpsRstct": "0",
								"videoId": "",
								"hasVideo": "0",
								"gdid": "00000009_0013077a1498",
								"deliveryFeeContent": "3000",
								"diffDeliveryFeeContent": "",
								"hasDeliveryFeeContent": "0",
								"eventContent": "",
								"hasEventContent": "0",
								"couponContent": "30040원^^^100",
								"hasCouponContent": "1",
								"cardContent": "",
								"hasCardContent": "0",
								"buyPointContent": "^498^498^^^0^0",
								"hasBuyPointContent": "1",
								"simImgSgntCount": "1",
								"mblSimImgSgntCnt": "1",
								"imgColorCd": "20481",
								"imgSgnt": "7717750556559274676711363840",
								"imgVersion": "8",
								"lowPriceByMallNo": "",
								"shopNNo": "788563",
								"newNormHit2": "0.4431",
								"dummy": "",
								"lowMallList": null,
								"mallInfoCache": {
									"seq": "788563",
									"prodCnt": "261",
									"name": "ENJOY PANDA",
									"bizplBaseAddr": "경기도 용인시 수지구 문인로 59 (동아.삼익.풍림아파트) 108동 1502호 (우 : 16830) ",
									"bizplDtlAddr": null,
									"businessNo": "4162451132",
									"onmktRegisterNo": "2018-용인수지-0626",
									"mallIntroduction": "세상의 즐거움을 판다",
									"mallLogos": {
										"REPRESENTATIVE": "https://shop-phinf.pstatic.net/20181228_251/gulliver012@naver.com_15459241027583x5Ld_JPEG/69231262378076613_1356613941.jpg",
										"FORYOU": "https://shopping-phinf.pstatic.net/20201109_28/d4a8ad81-26f9-4161-a123-531b7de8ab53.jpg"
									},
									"mallGrade": "M44003",
									"goodService": false,
									"talkAccountId": "wcdf3f",
									"eventScheduledCont": null,
									"adsrType": "SHOPN",
									"naverPay": true
								},
								"channelInfoCache": {
									"talkAccountId": "wcdf3f"
								},
								"crUrl": "https://cr.shopping.naver.com/adcr.nhn?x=fVglaMHvdgsMHYa9YJ131v%2F%2F%2Fw%3D%3DsT7Udy1UlbUo7qZ2fQPU73tZnuOMvwbHjISqv5ZWTAaywZeGnRgxnttveusjCcK4G7Kc4PqrwJF7qpLdYpcebFrsKQcnJ%2FJg9q37EThn39%2FPxzCfgaz5AZYoa5lPOiE0PX%2FMYwzHyPGCfaSzuR4SGA0uG%2FicFY3q9hGdjro9%2BnxQB%2BDfAyHyck2zRNsUR%2BFOEEqHbtm0Tg1to3Ff%2BjMptj2OCn0WJTO%2Fs0ym%2BnDVvCZfL%2Fowdnq7%2Fmfq67OVRzok0S5SJNLgIdS1XFCtZ5GETGNnavjW6D0OfMQK%2Fqu6WpzjjquHTbqw8MjgGZTCZ%2BtfUBb4JYLQV1GmAjQsWIhn8V%2F394Vj4cFxcdd%2FerfyIWWiMHn7BDBNaqXNmoKbAeTMvPVJgJF6wSYLCn1JftDpQvgDFOvcyLeZpoisExYu4%2F1rVB9bvlW48JJmeZr9%2BYKbBRDk%2FEZh%2F%2FdO4c%2FQLkd6hl7KplVynfEPZjUiAXsQ7U82WnZnAweq%2B%2B%2FV9uSkScRX%2BIlQXSCJ7gcvPdL52n9S1H4XYPAsRDenUA2y7iB0MhobUYQFGQSvtfMkDx8rp9K8q4%2FIvCLpcbTBVuQqlcTYf5F9XC7T4eYqQ%2BAdhynhFUPW355Mdu%2BBHBxwhnYs23GdoaGimR4pR27mrh1IoDTOSgA%3D%3D&nvMid=81729819800&catId=50000835",
								"crUrlMore": "https://cr.shopping.naver.com/adcr.nhn?x=7UXokPeTy7dAQXfP3DgQQv%2F%2F%2Fw%3D%3DsslEfMMm3codlDFyIASOjqqi%2BLBQ7UGp9L%2BsHABbmGXpLVSlAW5fWUPF%2Bxeno1sOrUxana%2FDyof6sNMyhcLDTi%2Bt7ZsVUZ%2BndCF3Ym3%2F4KRSOuHGPyXtEeLz8ccDcAe092M3yhuL7EojkjtlKdOo6ALuVw3GdaDAvxDSjC3cnt2Z%2F22ms%2BW8TiQQNz%2FOHMMFFx6mdGA9u%2F7sC4Gm3DLFFoMdx3THmt2Ua1AyfuwjnkOgvzrB%2F8Mq8q5FCHpxe4gmFyLfRC0o%2FWYDsFhk%2BnF4ktzVCZ4rdk8hPModxsSdH4jxuoBgOhf05ZLKHYY%2FpyXzXaND5BdiqU5%2BXatyMvWqJBX%2BUucnAxrsG3xHb9QOpCsJrR6puFRwx1J4Q4na%2BuwxM%2Fgmn9UWZ08Lu4vkhY3i2SBBYlbe18EfHbpSZmErndiyfLB440SYO1Cnk2bZ9BBPMrRsw2T1COAB3adgWpOQwMLTdcfGoFDbEgjZ9Qvt%2Fw50u%2FC86tDTe8A7VZgPIsttfLpZWN8skLy7TACK%2FKVvF9RrMKwZ6k3Cnv%2FmFpKn6BYPnlfMTIBWjuKvu5954syqo1g13VDxd5QBEZGpRgYgS%2BJw2pu7UAGtr%2BOajr5K2lK99Y9s3NC3X30JyNTTwr4NHAqFYP8YZgDWVRhWoVvk9uwN%2BQsjK6V0FLd%2Fybx7qcubNSE3OzZUT76KyqzckASmm&nvMid=81729819800&catId=50000835"
							},
							"type": "product"
						},
						,.....
}

 

 

 

2.스마트스토어 크롤링

URL: https://smartstore.naver.com/themineral/products/3967584267?

컬럼 스탭1컬럼 스탭2비고

smartStore.channel      
  mallSeq 쇼핑몰 ID 네이버쇼핑 mallNo, mallInfoCache.seq 와 동일값
  representName 쇼핑몰 상호명  
  identity 사업자 등록번호  
  representativeName 대표자 이름  
  businessAddressInfo.address 쇼핑몰 주소  
  chrgrEmail 쇼핑몰 이메일  
  representTelephoneNumber 쇼핑몰 고객센터 번호  

 

{
		"smartStore": {
		"channel": {
			"id": 500079743,
			"channelServiceType": "STOREFARM",
			"channelExternalStatusType": "NORMAL",
			"channelName": "The Mineral",
			"url": "themineral",
			"representImageInfoList": [
				{
					"imageUrl": "https://shop-phinf.pstatic.net/20150701_216/wondevil_1435684662386Cka0c_JPEG/eaf1e86a-26ca-45c4-a1ab-f6b7d01de731.JPG",
					"imageClass": "STORE_REPRESENTATIVE",
					"width": 160,
					"height": 160,
					"fileSize": 10128,
					"sortOrder": 0,
					"representative": false
				}
			],
			"talkAccountId": "wc8bxo",
			"talkExposureYn": true,
			"description": "저희는 국내매장 정품만 취급합니다.",
			"contactInfo": {
				"displayTelNo": true,
				"disabledDomesticTelNo": false,
				"telNo": {
					"countryCode": "KOR",
					"phoneNo": "01091692772",
					"formattedNumber": "010-9169-2772"
				},
				"overseaTelNo": {
					"countryCode": "KOR",
					"phoneNo": "",
					"formattedNumber": ""
				},
				"onlineSales": false,
				"offlineSales": false
			},
			"representType": "DOMESTIC_BUSINESS",
			"identity": "1313721095",
			"representName": "Won군",
			"representativeName": "원정섭",
			"businessType": "PRIVATE",
			"declaredToOnlineMarkettingNumber": "2015-인천남동구-0102",
			"businessAddressInfo": {
				"address": "405-260 인천광역시 남동구 서창남로 2 인천서창LH12단지 1212동 804호",
				"basicAddress": "인천광역시 남동구 서창남로 2 ",
				"detailAddress": "1212동 804호",
				"fullAddressInfo": "인천광역시 남동구 서창남로 2  인천서창LH12단지 1212동 804호 (우 : 405-260) ",
				"hasJibunAddress": true,
				"hasRoadNameAddress": false,
				"jibunAddress": "인천서창LH12단지",
				"oldZipCode": "405-260",
				"overseas": false,
				"zipCode": "405-260"
			},
			"accountNo": 500079743,
			"accountId": "wondevil",
			"mallSeq": 269716,
			"naverAccountId": "s_4b489fabbb0a4bc1",
			"storeExposureInfo": {
				"exposureInfo": {
					"NAVERBLOG": [
						"wondevil"
					],
					"INSTAGRAM": [
						"the_mineral7"
					]
				}
			},
			"chrgrEmail": "wondevil@naver.com",
			"naverPayNo": 500079743,
			"payReferenceKey": "500079743",
			"actionGrade": "SECOND",
			"serviceSatisfactionGrade": false,
			"saleCount": 3383,
			"csResponseRatio": 1,
			"in2DaysDeliveryCompleteRatio": 0.44,
			"averageSaleSatificationScore": 4.71,
			"naSiteId": "s_4b489fabbb0a4bc1",
			"naverAnalytics": "1559182310e941c",
			"representativeImageUrl": "https://shop-phinf.pstatic.net/20150701_216/wondevil_1435684662386Cka0c_JPEG/eaf1e86a-26ca-45c4-a1ab-f6b7d01de731.JPG",
			"isBusiness": true,
			"representTelephoneNumber": "010-9169-2772",
			"isDomesticPhoneNumber": true,
			"domesticTelephoneNumberReported": false,
			"isDomesticTelephoneNumberReportable": true,
			"domesticTelephoneNumberCertified": true,
			"plopYn": false,
			"productAuthCategoryTypes": [],
			"representativeBirthDay": "1982-09-05T15:00:00.000+0000",
			"brandStoreExhibitionYn": false,
			"brandStoreName": "The Mineral",
			"brandUrl": "themineral",
			"brandCatalogUseYn": false
		},
}

 

반응형

- 비동기 (Asynchronous: 동시에 일어나지 않는, 非同期: 같은 시기가 아닌)

비동기란 말 그대로 동시에 일어나지 않는다는 의미한다.

즉, 요청과 결과가 동시에 일어나지 않아 바로 결과가 주어지지 않고 나중에 처리된다

 

- 동기 (synchronous: 동시에 일어나는, 同期: 같은 시기)

동기란 비동기와 반대로 동시에 일어난다는 말한다. 따라서 요청과 그 결과가 동시에 일어나서 

요청을 하면 바로 그 요청한 자리에서 결과가 주어지며

시간이 얼마가 걸리든 상관 안하고 요청한 그 자리에서 결과를 주겠다는 약속같은 것이다.

즉, 요청과 결과가 한자리에서 동시에 일어난다

 

* 이렇게 동기와 비동기를 구분하는 이유는

동기와 비동기를 굳이 구분하는 이유는 상황에 따라서 장단점이 있기 때문인데

동기방식은 매우 설계가 간단하고 직관적이지만, 결과가 주어질 때까지 아무것도 못하고 대기해야 하는 단점이있고

비동기방식은 좀더 복잡하지만 결과가 주어지는 시간이 길어져도 그 시간 동안 다른 작업을 할 수 있으므로 좀더 효율적으로 자원을 사용할 수 있는 장점이있다

 

- 블로킹(Blocking)

블로킹은 말 그대로 작업이 중단된다는 의미. 네트워크 통신에서 요청이 발생하고 완료될 때까지 모든 일을 중단한 상태로 대기해야 하는 것을 블로킹 방식이라 한다.

(블로킹 방식의 소켓통신은 결과가 올 때까지 다른 작업을 중단하고 하염없이 기다리게 됨)

 

- 논블로킹(Non-blocking)

논블러킹은 말 그대로 중단되지 않는다는 말. 통신이 완료 될 때까지 중단되는 블로킹의 반대 개념이다.

논블로킹 방식은 아무래도 통신이 완료될 때까지 기다리지 않고 다른 작업을 수행할 수 있으므로 경우에 따라 효율이나 반응속도가 더 뛰어나다.

 

'JAVA' 카테고리의 다른 글

Kafka  (0) 2021.02.24
RestTemplate VS WebClient  (0) 2021.02.24
JAVA11  (0) 2019.10.04
Oracle JDK 라이센스 전환  (0) 2019.10.04
NAVER Search Ad - ADExtensions  (0) 2019.08.13
반응형

1. 문제 발생

위와 같은 해당 문제는 1번 서버에는 발생되지않았지만 real서버에서 발생되었습니다.

Spring Boot 2.0.4 → 2.3.4 버전 고도화를 하면서 AJP 생성시 LISTEN 생성시 ::ffff:127.0.0.1:8003 로컬에서만 연결될수있도록 형식으로 변경됩니다.

이전) :::8003 : 모든 IP에 포트를 열어주는 형식입니다.

Apache ajp 통신시 설정은 이상없지만 통신이 안되는 현상이 발견됨.

해당 부분 apache 설정에는 문제가 없었습니다.

 

2.조치방안

해당 apache 설정파일인 httpd.conf, httpd-ssl.conf 파일의 <VirtualHost>의 순서를 아래로 변경해줬을 경우 정상적으로 AJP 통신을 하는것을 확인하였습니다.

  • 순서변경으로 다른 service가 통신이 안되는 현상은 없었습니다.

원인에 대해선 1번 서버의 apache와 특정 서버의 apache가 version(2.4.27) 은 동일하였으며

Alpha서버에서는 정상적으로 되었지만 특정서버에서 이러한 현상이 이루어지면 순서를 변경해주시면 될것 같습니다.

'Server' 카테고리의 다른 글

Mac 단축키 변경  (0) 2021.08.24
patch.sh 스크립트 작성  (0) 2021.02.19
cat , tail 명령어 정리  (0) 2019.09.16
리눅스 Tar 압축, 풀기  (0) 2016.08.09
쉘 스크립트 FOR 사용법  (0) 2015.12.07
반응형

 

jdbc:mysql://127.0.0.1:3306/data?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&allowLoadLocalInfile=true

&serverTimezone=UTC : 해당 타입존이 없을경우 문제가 생기니 추가해주자.

 

The used command is not allowed with this MySQL version

해당 에러가 나올경우

&allowLoadLocalInfile=true 추가해주자.

 

반응형

MYSQL WORKBENCH 여러 쿼리문 실행 단축키

 

ctrl + shift + enter

'데이터베이스' 카테고리의 다른 글

UNION , UNION ALL 차이  (0) 2019.11.05
MySQL 숫자, 특수문자 체크  (0) 2019.10.28
MYSQL TokuDB  (0) 2019.09.20
중복 데이터를 가져오는 쿼리 문  (0) 2019.08.06
MYbatis fetchSize 설정  (0) 2019.07.09
반응형

Locale 에러가 날경우

해당 

locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory

 

나올경우

1. glibc-common 재설치

            yum reinstall glibc-common 

           재설치후 되지않을 경우

2. /etc/environment 변경

LANG=en_US.utf-8 추가

 

+ Recent posts