"지역별, 부동산 매매가격에 대한 최고매매와 최소매매의 가격 차이 통계"를 영어로 하면?
"Regional Real Estate Sales Price Difference Statistics: Maximum vs. Minimum Sale Prices"

1. 국토교통부 실거래가 조회.사이트에서 2019-2025년 매매자료 다운로드후에 SQLite에 입력
- 엑셀다운로드후에 편집후 자동업로드
2. 전국 네이버 아파트.기본 정보 크롤링을 통한 SQLite에 입력
- 자동크롤링
3. 1과 2를 조인해서 웹페이지 보여주는데, 공통조인 대상이 부족함
4. business.juso.go.kr 을 통해서, 네이버아파트정보의 지역명+아파트명을 조합해서 지번을 구함(본번,부번)
- 자동크롤링
5. 1과 2와 4를 조인해서 웹페이지 보여주는데, 이빨이 빠진부분(회색)이 있음
6. 이빨이 빠진부분(회색)이 있는 이유는 네이버아파트정보의 지역명+아파트명으로도 지번을 못구함(본번,부번)

1) 02-02  오전 10:00       144,285,696 database_all_total.db - 국토교통부 실거래가 자료
2) 02-02  오전 10:44           196,608 descending_in_base_all.db - 매매최대,최소갭 상위 200개 지역별 저장자료
3) 02-05  오후 08:19        23,379,968 naver_attach_estate_info_file.db - 지번이 포함되어진 네이버아파트 자료
4) 02-01  오전 10:40        24,993,792 naver_estate_info_file.db - 지번이 없는 네이버아파트 자료

1) 
dotnet new console -o RealEstateFileInsert
2)
dotnet new console -o RealEstateDescendingFileInsert
4)
dotnet new console -o RealNaverAutoCrollingDataInsert
3)
dotnet new winforms -o RealAddressAttachAutoCrollingDataInsert

 

index.html
0.01MB

 

throw는 예외를 명시적으로 던지는 데 사용됩니다. 예외를 직접 발생시키는 경우에 사용되며, try-catch 블록과는 다릅니다. try-catch는 예외를 처리하는 데 사용되고, throw는 예외를 발생시키는 데 사용됩니다.

throw의 사용 사례

  1. 특정 조건에서 예외를 명시적으로 던지기: 예를 들어, 프로그램 실행 중에 특정 조건이 만족되었을 때 예외를 발생시켜 오류를 알리고자 할 때 사용합니다.위 예제에서 age가 18 미만인 경우, IllegalArgumentException을 던져서 함수 호출자가 이를 처리하도록 합니다.
  2.  
    public void checkAge(int age) { if (age < 18) { throw new IllegalArgumentException("Age must be at least 18."); } System.out.println("Age is valid."); }
  3. 사용자 정의 예외 던지기: 특정 로직에서 정의된 예외를 던지기 위해 throw를 사용할 수 있습니다. 예를 들어, 자신의 애플리케이션에서 발생할 수 있는 예외를 정의하고 이를 던질 수 있습니다.
  4.  
    public class InsufficientFundsException extends Exception { public InsufficientFundsException(String message) { super(message); } } public void withdraw(double amount) throws InsufficientFundsException { if (amount > balance) { throw new InsufficientFundsException("Insufficient funds for withdrawal."); } balance -= amount; }
  5. 조건에 따른 예외를 의도적으로 발생시키기: 프로그램의 특정 상태나 조건에서 예외를 발생시켜, 이를 처리하도록 유도할 수 있습니다.
  6.  
    public void processOrder(Order order) { if (order == null) { throw new NullPointerException("Order cannot be null."); } // 나머지 로직 처리 }

throw와 throws의 차이점

  • throw는 예외를 던질 때 사용됩니다.
  • throws는 메서드 시그니처에 예외가 발생할 수 있음을 명시할 때 사용됩니다. 즉, throw와는 다르게 예외를 던진다는 것을 알리는 역할을 합니다.(?????)
 
public void someMethod() throws IOException { // 예외가 발생할 수 있음을 알림 throw new IOException("파일 읽기 오류"); }

따라서, throw는 예외를 실제로 던지는 데 사용되고, throws는 해당 메서드에서 예외가 발생할 수 있음을 호출자에게 알리는 역할을 합니다.

이 코드는 region[2]로 그룹화하여 첫 번째 <select id="regionGroup"> 에 표시하고,
해당 region[2]에 속하는 region[1]을 두 번째 <select id="regionSub"> 에 표시합니다.
사용자가 region[1]을 선택하면 value가 region[0]이 되고, 이를 sendData(value)로 전달합니다.

    <label for="regionGroup">지역 그룹:</label>
    <select id="regionGroup">
        <option value="">-- 선택하세요 --</option>
    </select>

    <label for="regionSub">세부 지역:</label>
    <select id="regionSub">
        <option value="">-- 선택하세요 --</option>
    </select>

    <script>
        const region = [
            ["1168000000","강남구","서울시"],
            ["1174000000","강동구","서울시"],
            ["1130500000","강북구","서울시"],
            ["1132000000","도봉구","서울시"],
            ["1123000000","동대문구","서울시"],
            ["1159000000","동작구","서울시"],
            ["1147000000","양천구","서울시"],
            ["1156000000","영등포구","서울시"],
            ["1117000000","용산구","서울시"],
            ["1138000000","은평구","서울시"],
            ["1111000000","종로구","서울시"],
            ["1114000000","중구","서울시"],
            ["1126000000","중랑구","서울시"],
            ["4182000000","가평군","경기도"],
            ["4128100000","고양시 덕양구","경기도"],
            ["4128500000","고양시 일산동구","경기도"],
            ["4113300000","성남시 중원구","경기도"],
            ["4163000000","양주시","경기도"],
            ["4122000000","평택시","경기도"],
            ["4165000000","포천시","경기도"],
            ["4145000000","하남시","경기도"],
            ["4159000000","화성시","경기도"],
            ["2871000000","강화군","인천시"],
            ["2824500000","계양구","인천시"],
            ["2641000000","금정구","부산시"],
        ];

        const regionGroupSelect = document.getElementById("regionGroup");
        const regionSubSelect = document.getElementById("regionSub");

        // 그룹화된 지역 그룹 가져오기
        const groups = [...new Set(region.map(item => item[2]))];

        // 그룹화된 데이터 <select>에 추가
        groups.forEach(group => {
            const option = document.createElement("option");
            option.value = group;
            option.textContent = group;
            regionGroupSelect.appendChild(option);
        });

        // 지역 그룹 변경 시 세부 지역 업데이트
        regionGroupSelect.addEventListener("change", () => {
            const selectedGroup = regionGroupSelect.value;
            regionSubSelect.innerHTML = '<option value="">-- 선택하세요 --</option>'; // 초기화

            if (selectedGroup) {
                const filteredRegions = region.filter(item => item[2] === selectedGroup);
                filteredRegions.forEach(item => {
                    const option = document.createElement("option");
                    option.value = item[0];
                    option.textContent = item[1];
                    regionSubSelect.appendChild(option);
                });
            }
        });

        // 세부 지역 선택 시 SendData 호출
        regionSubSelect.addEventListener("change", () => {
            const selectedValue = regionSubSelect.value;
            if (selectedValue) {
                SendData(selectedValue);
            }
        });

        // SendData 함수 정의
        function SendData(value) {
            alert(`Selected value: ${value}`);
            console.log("SendData called with value:", value);
        }
    </script>

아파트명클릭시에 네이버부동산으로 LINK)

 

index.html
0.03MB

네이버부동산.매매상한.하한 (Web Crawling) 아키텍쳐

1. Web Crawling Server By C# code
2. Web Crawling Data Interface By Redis Engine
3. Node Server

웹페이지 Estate.Redis.Server(네이버부동산.크롤링 엔진) <-> REDIS
Estate.Node.Server <-> REDIS

 

**웹페이지 크롤링(Web Crawling)**은 인터넷 상의 웹페이지들을 자동으로 탐색하고 데이터를 수집하는 작업을 의미합니다. 이 작업은 주로 웹 크롤러(Web Crawler) 또는 **스파이더(Spider)**라고 불리는 프로그램이나 스크립트를 사용해 수행됩니다.

웹 크롤링의 주요 과정

  1. 시작 URL 설정: 크롤링할 웹사이트의 URL(예: https://example.com)을 시작점으로 설정합니다.
  2. HTML 문서 다운로드: 웹페이지의 HTML 소스 코드를 HTTP 요청을 통해 다운로드합니다.
  3. 데이터 파싱: HTML 문서에서 필요한 데이터(텍스트, 이미지, 링크 등)를 분석 및 추출합니다.
  4. 새로운 링크 수집: 페이지 내의 하이퍼링크를 추출하여, 크롤링할 새로운 페이지를 추가로 찾아냅니다.
  5. 반복: 설정된 범위나 조건에 따라 위 과정을 반복합니다.

사용 목적

  • 검색 엔진: 구글이나 네이버 같은 검색 엔진은 크롤러를 사용해 웹페이지를 수집하고 색인화하여 검색 결과를 제공합니다.
  • 데이터 수집: 특정 주제나 산업 관련 데이터를 대량으로 수집하여 분석에 활용합니다.
  • 가격 비교: 전자상거래 사이트에서 상품의 가격 정보를 비교하기 위해 사용됩니다.
  • 콘텐츠 추출: 뉴스, 블로그, 리뷰 사이트 등에서 정보를 수집하여 재가공합니다.

웹 크롤링 도구 및 라이브러리

  • Python: BeautifulSoup, Scrapy, Selenium
  • Java: Jsoup, Apache Nutch
  • JavaScript: Puppeteer, Cheerio

주의사항

  1. 저작권 및 이용약관: 크롤링 대상 사이트의 데이터를 수집하고 사용할 때는 저작권과 이용약관을 준수해야 합니다.
  2. robots.txt: 대부분의 웹사이트는 robots.txt 파일을 통해 크롤러가 접근 가능한 경로와 불가능한 경로를 명시합니다.
  3. 서버 부하: 크롤러의 과도한 요청은 서버에 부담을 줄 수 있으므로 요청 간격 조정과 적절한 속도 제어가 필요합니다.

웹 크롤링은 데이터를 자동화하여 효율적으로 수집할 수 있는 강력한 도구이지만, 윤리적이고 합법적인 방식으로 활용하는 것이 중요합니다.

네이버부동산.크롤링 매매상한,하한,전세상한,하한(경기도)

 

index.html
0.02MB

"4182000000","가평군"
"4128100000","고양시 덕양구"
"4128500000","고양시 일산동구"
"4128700000","고양시 일산서구"
"4129000000","과천시"
"4121000000","광명시"
"4161000000","광주시"
"4131000000","구리시"
"4141000000","군포시"
"4157000000","김포시"
"4136000000","남양주시"
"4125000000","동두천시"
"4119400000","부천시 소사구"
"4119600000","부천시 오정구"
"4119200000","부천시 원미구"
"4113500000","성남시 분당구"
"4113100000","성남시 수정구"
"4113300000","성남시 중원구"
"4111300000","수원시 권선구"
"4111700000","수원시 영통구"
"4111100000","수원시 장안구"
"4111500000","수원시 팔달구"
"4139000000","시흥시"
"4127300000","안산시 단원구"
"4127100000","안산시 상록구"
"4155000000","안성시"
"4117300000","안양시 동안구"
"4117100000","안양시 만안구"
"4163000000","양주시"
"4183000000","양평군"
"4167000000","여주시"
"4180000000","연천군"
"4137000000","오산시"
"4146300000","용인시 기흥구"
"4146500000","용인시 수지구"
"4146100000","용인시 처인구"
"4143000000","의왕시"
"4115000000","의정부시"
"4150000000","이천시"
"4148000000","파주시"
"4122000000","평택시"
"4165000000","포천시"
"4145000000","하남시"
"4159000000","화성시"

 

네이버부동산.크롤링 매매상한,하한,전세상한,하한(전체지역)

{"1100000000","서울시"},
{"4100000000","경기도"},
{"2800000000","인천시"},
{"2600000000","부산시"},
{"3000000000","대전시"},
{"2700000000","대구시"},
{"3100000000","울산시"},
{"3600000000","세종시"},
{"2900000000","광주시"},
{"5100000000","강원도"},
{"4300000000","충청북도"},
{"4400000000","충청남도"},
{"4700000000","경상북도"},
{"4800000000","경상남도"},
{"5200000000","전북도"},
{"4600000000","전라남도"},
{"5000000000","제주도"},

https://new.land.naver.com/api/regions/list?cortarNo=5011011100
https://new.land.naver.com/api/regions/list?cortarNo=5011013300
[2024-12-29 11:28:10]
Table 'ESTATENAVERALLINFO' has been successfully deleted.
[2024-12-29 11:28:10]
62483 rows have been transferred.
[2024-12-29 11:28:10]


Recursive 형태로 접근, 전체 APT를 수집해서 SQLite 테이블에 저장

1. 서버에서 크롤링및 저장
2. 조회시에 REDIS를 통한 데이타제공

 

 

index.html
0.01MB
index_by_dong.html
0.02MB

 

쓰레드 프로그램에서 여러 사람이 동시에 사용 중에 데드락(교착 상태, Deadlock)이 발생하는 경우는 다음과 같은 상황에서 주로 나타납니다.

1. 상호 배제 (Mutual Exclusion)

  • 공유 자원이 동시에 여러 쓰레드에 의해 사용되지 않도록 하기 위해 락(Lock)을 사용하는 경우.
  • 특정 자원이 한 번에 하나의 쓰레드만 사용할 수 있도록 제한되기 때문에 다른 쓰레드가 자원을 대기하게 됩니다.

2. 점유 및 대기 (Hold and Wait)

  • 한 쓰레드가 이미 락을 점유한 상태에서 다른 자원을 요청하지만, 그 자원이 다른 쓰레드에 의해 점유되고 있는 상황.
  • 이미 점유한 락을 해제하지 않고 대기하면서 교착 상태가 발생합니다.

3. 비선점 (No Preemption)

  • 점유한 자원을 강제로 회수하지 못하는 경우.
  • 즉, 쓰레드가 스스로 자원을 반환할 때까지 기다려야 하며, 대기 상태가 해결되지 않을 가능성이 있습니다.

4. 순환 대기 (Circular Wait)

  • 두 개 이상의 쓰레드가 서로 자원을 대기하면서 순환 구조가 형성되는 경우.
  • 예:
    • 쓰레드 A는 자원 1을 점유하고 자원 2를 요청.
    • 쓰레드 B는 자원 2를 점유하고 자원 1을 요청.

데드락 발생 예시

class DeadlockExample {
    private final Object lock1 = new Object();
    private final Object lock2 = new Object();

    public void method1() {
        synchronized (lock1) {
            System.out.println("Thread 1: Holding lock1...");
            try { Thread.sleep(100); } catch (InterruptedException e) {}
            System.out.println("Thread 1: Waiting for lock2...");
            synchronized (lock2) {
                System.out.println("Thread 1: Acquired lock2!");
            }
        }
    }

    public void method2() {
        synchronized (lock2) {
            System.out.println("Thread 2: Holding lock2...");
            try { Thread.sleep(100); } catch (InterruptedException e) {}
            System.out.println("Thread 2: Waiting for lock1...");
            synchronized (lock1) {
                System.out.println("Thread 2: Acquired lock1!");
            }
        }
    }
}

public class DeadlockTest {
    public static void main(String[] args) {
        DeadlockExample example = new DeadlockExample();

        Thread t1 = new Thread(example::method1);
        Thread t2 = new Thread(example::method2);

        t1.start();
        t2.start();
    }
}

설명

  • Thread 1은 lock1을 점유하고 lock2를 요청.
  • 동시에, Thread 2는 lock2를 점유하고 lock1을 요청.
  • 두 쓰레드가 서로를 기다리며 순환 대기 상태가 발생하여 데드락이 생깁니다.

데드락 방지 방법

  1. 자원 획득 순서 지정
    • 모든 쓰레드가 자원을 요청하는 순서를 동일하게 유지합니다.
  2. 타임아웃 설정
    • 자원 요청 시 일정 시간 대기 후 실패로 처리하여 데드락을 방지합니다.
  3. 데드락 감지 및 회복
    • 데드락 감지 알고리즘을 통해 순환 대기를 탐지하고 적절히 해소합니다.
  4. 자원 회수
    • 자원 점유가 너무 길어지면 강제로 회수하는 방법을 고려합니다.
  5. 락 분해 (Lock Granularity 감소)
    • 큰 락을 여러 작은 락으로 분리하여 동시성을 높이고 데드락 가능성을 줄입니다.

error CS0246: 'ServiceStack' 형식 또는 네임스페이스 이름을 찾을 수 없습니다. using 지시문 또는 어셈블리 참조가 있는지 확인하세요.
error CS0246: 'Newtonsoft' 형식 또는 네임스페이스 이름을 찾을 수 없습니다. using 지시문 또는 어셈블리 참조가 있는지 확인하세요.
error CS0234: 'System.Data' 네임스페이스에 'SQLite' 형식 또는 네임스페이스 이름이 없습니다. 어셈블리 참조가 있는지 확인하세요.
error CS0246: 'SQLiteConnection' 형식 또는 네임스페이스 이름을 찾을 수 없습니다. using 지시문 또는 어셈블리 참조가 있는지 확인하세요.
error CS0246: 'RedisClient' 형식 또는 네임스페이스 이름을 찾을 수 없습니다. using 지시문 또는 어셈블리 참조가 있는지 확인하세요.

제시하신 에러 메시지를 보면, 코드에서 사용하고 있는 네임스페이스나 타입들이 찾을 수 없다는 오류입니다. 이는 관련된 NuGet 패키지가 프로젝트에 설치되지 않았거나, 제대로 참조되지 않았기 때문에 발생한 문제로 보입니다.

각 에러 메시지에 대해 필요한 NuGet 패키지를 아래와 같이 정리할 수 있습니다:

1. 'ServiceStack' 형식 또는 네임스페이스 이름을 찾을 수 없습니다.

이 에러는 ServiceStack 라이브러리를 찾을 수 없다는 오류입니다. 이 라이브러리를 사용하려면 ServiceStack NuGet 패키지를 설치해야 합니다.

설치 명령:

 
dotnet add package ServiceStack

2. 'Newtonsoft' 형식 또는 네임스페이스 이름을 찾을 수 없습니다.

이 에러는 Newtonsoft.Json 라이브러리를 찾을 수 없다는 오류입니다. 이 라이브러리를 사용하려면 Newtonsoft.Json 패키지를 설치해야 합니다.

설치 명령:

dotnet add package Newtonsoft.Json

3. 'System.Data.SQLite' 형식 또는 네임스페이스 이름을 찾을 수 없습니다.

이 에러는 SQLite 관련 네임스페이스를 찾을 수 없다는 오류입니다. SQLite를 사용하려면 System.Data.SQLite 패키지를 설치해야 합니다.

설치 명령:

dotnet add package System.Data.SQLite

4. 'SQLiteConnection' 형식 또는 네임스페이스 이름을 찾을 수 없습니다.

위와 동일한 이유로, System.Data.SQLite 패키지가 필요합니다.

설치 명령:

dotnet add package System.Data.SQLite

5. 'RedisClient' 형식 또는 네임스페이스 이름을 찾을 수 없습니다.

이 에러는 Redis 관련 클래스인 RedisClient를 찾을 수 없다는 오류입니다. Redis를 사용하려면 ServiceStack.Redis 패키지를 설치해야 합니다.

설치 명령:

dotnet add package ServiceStack.Redis

요약

위의 네임스페이스와 클래스를 사용하기 위한 NuGet 패키지들은 다음과 같습니다:

  1. ServiceStack - dotnet add package ServiceStack
  2. Newtonsoft.Json - dotnet add package Newtonsoft.Json
  3. System.Data.SQLite - dotnet add package System.Data.SQLite
  4. ServiceStack.Redis - dotnet add package ServiceStack.Redis

각각의 패키지를 설치한 후, 다시 빌드를 시도해보세요.

+ Recent posts