저널 파일(Journal File)은 컴퓨터 시스템에서 변경 사항을 기록하는 로그 파일의 일종으로, 주로 데이터베이스, 파일 시스템, 애플리케이션에서 사용됩니다.

1. 주요 역할

  • 데이터 무결성 유지: 시스템 충돌, 전원 장애 등의 상황에서도 데이터가 손실되지 않도록 변경 사항을 기록함.
  • 복구 기능 제공: 장애 발생 시 저널 파일을 이용해 데이터베이스나 파일 시스템을 일관된 상태로 복구 가능.
  • 추적 및 감사 로그: 변경 내역을 기록하여 시스템 운영 및 문제 해결에 활용.

2. 주요 용도

  • 데이터베이스: SQLite, MySQL, PostgreSQL 등에서는 트랜잭션 로그 또는 저널 파일을 활용해 데이터 일관성을 유지.
  • 파일 시스템: NTFS, ext4 등 저널링 파일 시스템에서는 파일 변경 사항을 기록하여 갑작스러운 오류 발생 시 복구를 지원.
  • 응용 프로그램: 일부 소프트웨어는 실행 중 변경 내용을 기록하여 예기치 않은 종료 후 복원 기능 제공.

3. 데이터베이스에서의 저널 파일 예시 (SQLite)

SQLite에서는 WAL (Write-Ahead Logging) 또는 Rollback Journal 방식의 저널 파일을 사용하여 데이터 변경 사항을 저장함.

  • 파일명-journal: 롤백 저널 방식 사용 시 생성됨.
  • 파일명-wal: WAL 모드 사용 시 생성됨.

✅ 요약

저널 파일은 시스템의 변경 사항을 기록하여 장애 발생 시 데이터를 보호하고 복구하는 중요한 역할을 합니다. 특히 데이터베이스와 파일 시스템에서 널리 사용됩니다.

 

REQUEST)
isam 파일과 Journal File 은 어떤 차이가 있나요?

 

ChatGPT의 말:

ISAM(Indexed Sequential Access Method) 파일과 Journal File은 각각 다른 목적과 방식으로 데이터 저장 및 관리에 사용됩니다.

1. ISAM 파일 vs. Journal File 개요

구분ISAM 파일Journal 파일
주요 목적 데이터 저장 및 검색 (빠른 인덱스 기반 조회) 변경 사항을 기록하여 데이터 복구 및 무결성 유지
사용처 데이터베이스, 파일 시스템 데이터베이스, 파일 시스템, 애플리케이션
주요 기능 - 인덱스를 활용한 빠른 데이터 조회
- 순차 및 랜덤 접근 지원
- 변경된 데이터를 기록
- 장애 발생 시 복구 및 롤백 지원
데이터 저장 방식 정적인 데이터 저장 및 인덱싱 트랜잭션의 변경 사항을 로그 형태로 기록
파일 생성 방식 데이터 파일(.ISD), 인덱스 파일(.ISM) 트랜잭션 발생 시 자동 생성 (예: db.journal, db-wal)

2. ISAM 파일이란?

**ISAM(Indexed Sequential Access Method)**은 데이터베이스 및 파일 시스템에서 인덱스 기반으로 데이터를 검색하고 저장하는 방법입니다.
주로 빠른 조회 성능이 중요한 경우 사용됩니다.

ISAM 파일의 특징

  • 데이터 파일(.ISD)과 인덱스 파일(.ISM)로 구성됨.
  • 인덱스를 활용하여 빠른 검색과 정렬된 데이터 조회 가능.
  • 순차 검색(Sequential Access)과 랜덤 검색(Random Access) 모두 지원.
  • MySQL의 MyISAM 스토리지 엔진이 대표적인 예.

ISAM 파일 사용 예

  • MySQL MyISAM 엔진: *.MYD(데이터), *.MYI(인덱스) 파일 사용.
  • IBM DB2, VSAM 등에서도 유사한 방식 사용.

3. Journal 파일이란?

Journal 파일은 시스템에서 변경된 데이터를 기록하여 장애 발생 시 복구 및 무결성 유지에 초점을 맞춘 파일입니다.

Journal 파일의 특징

  • 트랜잭션 로그 형식으로 데이터 변경 사항 기록.
  • 장애 발생 시, Redo (복구) 또는 Undo (롤백) 가능.
  • 파일 시스템(NTFS, ext4) 및 데이터베이스(SQLite, PostgreSQL)에서 사용됨.

Journal 파일 사용 예

  • 데이터베이스
    • SQLite: *.journal, *-wal 파일 사용.
    • PostgreSQL: pg_wal(Write-Ahead Logging).
  • 파일 시스템
    • NTFS, ext4 파일 시스템의 저널링 기능.

4. 주요 차이점 정리

구분ISAM 파일Journal 파일
기능 인덱스를 활용한 빠른 데이터 조회 트랜잭션 변경 사항을 기록하여 복구 가능
목적 검색 성능 최적화 데이터 일관성 및 복구
파일 구성 데이터 파일 + 인덱스 파일 변경 사항을 기록하는 로그 파일
장애 복구 데이터 손실 시 별도 복구 필요 장애 발생 시 복구 가능

✅ 결론

  • ISAM 파일데이터 조회 성능을 높이기 위한 구조이며,
  • Journal 파일데이터 변경 사항을 기록하여 복구를 지원하는 역할을 합니다.

즉, ISAM은 "빠른 검색"에 초점, Journal 파일은 "데이터 보호 및 복구"에 초점을 맞춘 개념입니다.

 

국토교통부실거래가 + 네이버매매호가를 조합한 통계

지역별 아파트 매매호가대비 실거래가 비율
>Ratio of Actual Transaction Price to Asking Price for Apartment Sales by Region(2019~2024)

현재 네이버매매호가 대비, 과거 실거래가(최대매매가격)을 비교했을때의 비율을 알고싶어서 작성해보았습니다.

 

app.js
0.01MB
index.html
0.02MB

 

호가 대비 실거래가 비율

        string sql = $@"
SELECT A.ComplexName, 
       A.AreaSquareMeters,  -- 전용면적(㎡)
       MAX(A.TransactionAmount) AS MaxTransactionAmount,  -- 실거래가 최대값
       MAX(CAST(B.MAXPRICE AS REAL)) AS MaxMarketPrice,  -- 최대 호가 값
       MAX(A.TransactionAmount) / MAX(CAST(B.MAXPRICE AS REAL)) * 100 AS RealToMarketRatio,  -- 실거래가 대비 호가 비율
       B.COMPLEXNAME, 
       B.LNBRMNNM, 
       B.LNBRSLNO
FROM REALESTATEAPTALL A
JOIN (
    SELECT COMPLEXNAME, LNBRMNNM, LNBRSLNO, MAX(MAXPRICE) AS MAXPRICE
    FROM ESTATENAVERALLINFOATTACH
    WHERE CORTARADDRESS LIKE '{cityCountryText}%' AND REALESTATETYPECODE <> 'OPST'
    GROUP BY COMPLEXNAME, LNBRMNNM, LNBRSLNO
) B
ON A.ComplexName = B.COMPLEXNAME 
AND A.MainNumber = B.LNBRMNNM 
AND A.SubNumber = B.LNBRSLNO
WHERE A.CityCounty LIKE '{cityCountryNM}%'
AND B.MAXPRICE IS NOT NULL AND B.MAXPRICE != ''  -- 빈 값 및 NULL 처리
GROUP BY A.ComplexName, A.AreaSquareMeters, B.COMPLEXNAME, B.LNBRMNNM, B.LNBRSLNO
ORDER BY RealToMarketRatio DESC, A.AreaSquareMeters DESC  -- 실거래가 최대값 기준으로 정렬

 

 

Program.cs
0.02MB

1. 가격 변동 및 트렌드 분석

1.1. 매매가 변동률 (연도별 평균 매매가 변화율)

 
SELECT strftime('%Y', ContractYearMonth) AS Year, AVG(TransactionAmount) AS AvgPrice FROM REALESTATEAPTALL GROUP BY Year ORDER BY Year;

1.2. 호가 대비 실거래가 비율

 
SELECT A.ComplexName, AVG(A.TransactionAmount) / AVG(CAST(B.MAXPRICE AS REAL)) * 100 AS RealToMarketRatio FROM REALESTATEAPTALL A JOIN ESTATENAVERALLINFOATTACH B ON A.CityCounty = B.CORTARADDRESS AND A.MainNumber = B.LNBRMNNM AND A.SubNumber = B.LNBRSLNO GROUP BY A.ComplexName;

1.3. 최대-최소 가격 범위 (단지별로)

 
SELECT A.ComplexName, MAX(A.TransactionAmount) - MIN(A.TransactionAmount) AS PriceRange FROM REALESTATEAPTALL A GROUP BY A.ComplexName;

🏢 2. 아파트별 상세 분석

2.1. 단지별 거래량

 
SELECT ComplexName, COUNT(*) AS TransactionCount FROM REALESTATEAPTALL GROUP BY ComplexName ORDER BY TransactionCount DESC;

2.2. 평형대별 평균가

 
SELECT ROUND(AreaSquareMeters / 3.3) AS Pyeong, AVG(TransactionAmount) AS AvgPrice FROM REALESTATEAPTALL GROUP BY Pyeong ORDER BY Pyeong;

2.3. 신축 vs 구축 가격 차이

 
SELECT CASE WHEN ConstructionYear >= 2015 THEN '신축' ELSE '구축' END AS BuildingAge, AVG(TransactionAmount) AS AvgPrice FROM REALESTATEAPTALL GROUP BY BuildingAge;

📈 3. 투자 가치 및 수익률 분석

3.1. 매매-전세 갭

 
SELECT A.ComplexName, AVG(A.TransactionAmount) - AVG(CAST(B.MAXLEASEPRICE AS REAL)) AS GapPrice FROM REALESTATEAPTALL A JOIN ESTATENAVERALLINFOATTACH B ON A.CityCounty = B.CORTARADDRESS AND A.MainNumber = B.LNBRMNNM AND A.SubNumber = B.LNBRSLNO GROUP BY A.ComplexName;

3.2. 전세가율

 
SELECT A.ComplexName, AVG(CAST(B.MAXLEASEPRICE AS REAL)) / AVG(CAST(B.MAXPRICE AS REAL)) * 100 AS LeaseRatio FROM ESTATENAVERALLINFOATTACH B JOIN REALESTATEAPTALL A ON A.CityCounty = B.CORTARADDRESS AND A.MainNumber = B.LNBRMNNM AND A.SubNumber = B.LNBRSLNO GROUP BY A.ComplexName;

📌 4. 지역별 비교 분석

4.1. 지역별 시세 격차

 
SELECT CityCounty, AVG(TransactionAmount) AS AvgPrice FROM REALESTATEAPTALL GROUP BY CityCounty ORDER BY AvgPrice DESC;

4.2. 인기 지역 분석 (거래량 많은 순)

 
SELECT CityCounty, COUNT(*) AS TransactionCount FROM REALESTATEAPTALL GROUP BY CityCounty ORDER BY TransactionCount DESC;

📊 5. 특이사항 및 추가 분석

5.1. 급매 vs 일반 매물 (평균 이하 가격 비율)

 
WITH AvgPrice AS ( SELECT ComplexName, AVG(TransactionAmount) AS AvgTransPrice FROM REALESTATEAPTALL GROUP BY ComplexName ) SELECT A.ComplexName, SUM(CASE WHEN A.TransactionAmount < B.AvgTransPrice THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS BelowAvgRatio FROM REALESTATEAPTALL A JOIN AvgPrice B ON A.ComplexName = B.ComplexName GROUP BY A.ComplexName;

5.2. 공시지가 대비 매매가
공시지가 테이블이 없다면 가정하고 작성한 쿼리입니다.

 
SELECT A.ComplexName, AVG(A.TransactionAmount) / AVG(B.OfficialPrice) * 100 AS PriceToOfficialRatio FROM REALESTATEAPTALL A JOIN OFFICIALPRICES B ON A.CityCounty = B.CityCounty AND A.MainNumber = B.MainNumber AND A.SubNumber = B.SubNumber GROUP BY A.ComplexName;

'기획 > 기획및 컨텐츠' 카테고리의 다른 글

호가 대비 실거래가 비율  (0) 2025.03.06
부동산통계(특이사항 및 추가 분석)  (1) 2025.03.06

국토교통부의 실거래가 매매현황(2019~2024) 데이터와 네이버부동산의 아파트 리스트 및 호가 데이터를 주소와 지번을 기준으로 매칭해 사용할 수 있는 통계 항목들은 다음과 같습니다.


📊 1. 가격 변동 및 트렌드 분석

  1. 매매가 변동률:
    • 연도별, 분기별 매매가 상승 또는 하락 비율.
  2. 호가 대비 실거래가 비율:
    • 실거래가 / 매매호가 평균 비율 분석.
  3. 최대-최소 가격 범위:
    • 동일 단지 내 연도별 최대-최소 매매가 및 호가 차이.
  4. 평균 매매가 및 호가 추이:
    • 연도별 평균 매매가, 매매호가, 전세호가 변화 추이.
  5. 시세 대비 실거래가 차이:
    • 특정 시점의 호가와 실거래가 비교.

🏢 2. 아파트별 상세 분석

  1. 단지별 거래량:
    • 연도별, 월별 매매 거래 횟수.
  2. 평형대별 평균가:
    • 전용면적별 평균 매매가, 매매호가, 전세호가.
  3. 신축 vs 구축 가격 차이:
    • 준공 연도 기준으로 구분한 매매가 차이.

📈 3. 투자 가치 및 수익률 분석

  1. 연평균 상승률:
    • 매매가의 연평균 상승률 및 호가 상승률.
  2. 매매-전세 갭:
    • 매매가와 전세가의 차이를 통해 갭 투자 가능성 분석.
  3. 전세가율:
    • (전세호가 / 매매호가) × 100% 비율.
  4. 투자 회수 기간:
    • 매매가 대비 연간 임대 수익을 통한 투자 회수 기간.

📌 4. 지역별 비교 분석

  1. 지역별 시세 격차:
    • 시군구 또는 행정동별 평균 매매가 및 호가 비교.
  2. 인기 지역 분석:
    • 거래량 및 호가가 높은 지역 순위.
  3. 주변 개발 호재 영향:
    • 특정 지역 개발 이슈 전후 매매가 비교.

📊 5. 특이사항 및 추가 분석

  1. 급매 vs 일반 매물:
    • 평균보다 낮은 호가로 나온 매물 비율 및 실거래가 비교.
  2. 거래 비수기 분석:
    • 거래량이 급감하는 시기 및 가격 변화 패턴.
  3. 공시지가 대비 매매가:
    • 공시지가 대비 매매가의 비율.

'기획 > 기획및 컨텐츠' 카테고리의 다른 글

호가 대비 실거래가 비율  (0) 2025.03.06
가격 변동 및 트렌드 분석(SQLite.SQL)  (0) 2025.03.06

부동산.크롤링.국토교통부.실거래가.통계.조회조건추가(금액대별)
부동산.크롤링.국토교통부.실거래가.통계.조회조건추가(금액대별)
부동산.크롤링.국토교통부.실거래가.통계.조회조건추가(금액대별)

조회조건추가)
1. 지역
2. 조회조건
3. 건수
4. 금액대별

 

 

index.html
0.03MB

 

 



1) SQLite 테이블을 메모리기반으로 SQL을 실행할경우

void LoadDatabaseIntoMemory(string filePath, SQLiteConnection memoryConn)
{
    using (var fileConn = new SQLiteConnection($"Data Source={filePath};Version=3;"))
    {
fileConn.Open();
fileConn.BackupDatabase(memoryConn, "main", "main", -1, null, 0);
    }
}
        workingDirectory = Directory.GetCurrentDirectory();

        DESCENDING_DB = Path.Combine(workingDirectory, @"descending_in_base_all.db");
        ANESTATE_DB = Path.Combine(workingDirectory, @"database_all_total.db");
        ESTATENAVER_DB = Path.Combine(workingDirectory, @"naver_attach_estate_info_file.db");

        // 메모리 기반 SQLite 연결 생성
        memoryConn1 = new SQLiteConnection("Data Source=:memory:;Version=3;");
        memoryConn2 = new SQLiteConnection("Data Source=:memory:;Version=3;");
        memoryConn3 = new SQLiteConnection("Data Source=:memory:;Version=3;");

        memoryConn1.Open();
        memoryConn2.Open();
        memoryConn3.Open();

        try
        {
            // 파일 DB 데이터를 메모리 DB로 복사
            LoadDatabaseIntoMemory(DESCENDING_DB, memoryConn1);
            LoadDatabaseIntoMemory(ANESTATE_DB, memoryConn2);
            LoadDatabaseIntoMemory(ESTATENAVER_DB, memoryConn3);

            // 메모리 DB로 사용
            APMSQLite.GetInstance.FetchDescendingConn = memoryConn1;
            APMSQLite.GetInstance.FetchEstateConn = memoryConn2;
            APMSQLite.GetInstance.FetchNaverAttachConn = memoryConn3;

            // 메모리 DB에 테이블이 정상적으로 로드되었는지 확인
            Console.WriteLine("\n===== Memory DB Loaded Tables =====");
            PrintTables(memoryConn1, "Descending DB");
            PrintTables(memoryConn2, "Estate DB");
            PrintTables(memoryConn3, "Naver Attach DB");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }

수행시간)

시작: 2025-02-27 10:03:55.089
종료: 2025-02-27 10:04:02.441

  1. 초 차이 계산
    • 10:04:02.441 - 10:03:55.089
    • 02.441초 - 55.089초 = 7.352초
따라서, 두 타임스탬프의 차이는 7.352초입니다.

 

2) SQLite 테이블을 파일기반으로 SQL을 실행할경우

string workingDirectory = Directory.GetCurrentDirectory();

        string DESCENDING_DB = Path.Combine(workingDirectory, @"descending_in_base_all.db");
        string ANESTATE_DB = Path.Combine(workingDirectory, @"database_all_total.db");
        string ESTATENAVER_DB = Path.Combine(workingDirectory, @"naver_attach_estate_info_file.db");
        
        APMSQLite.GetInstance.FetchDescendingConn = new SQLiteConnection($"Data Source={DESCENDING_DB};Version=3;");
        APMSQLite.GetInstance.FetchDescendingConn.Open();
        
        APMSQLite.GetInstance.FetchEstateConn = new SQLiteConnection($"Data Source={ANESTATE_DB};Version=3;");
        APMSQLite.GetInstance.FetchEstateConn.Open();
        
        APMSQLite.GetInstance.FetchNaverAttachConn = new SQLiteConnection($"Data Source={ESTATENAVER_DB};Version=3;");
        APMSQLite.GetInstance.FetchNaverAttachConn.Open();

수행시간

시작: 2025-02-27 10:04:54.994
종료: 2025-02-27 10:05:28.504

  1. 초 차이 계산
    • 10:05:28.504 - 10:04:54.994
    • 분 차이: 10:05 - 10:04 = 1분 (60초)
    • 초 차이: 28.504초 - 54.994초 = -26.490초
    • 1분(60초)을 고려하면, 60 - 26.490 = 33.510초
따라서, 두 타임스탬프의 차이는 33.510초입니다.


결론)
테이블의 데이타를 메모리에 올려서 실행하는것이 파일기반으로 실행하는것보다 5배정도 빠르다.
테이블의 데이타를 메모리에 올려서 실행하는것이 파일기반으로 실행하는것보다 5배정도 빠르다.

 



index.html
0.03MB

+ Recent posts