Skip to content
This repository was archived by the owner on Oct 28, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 101 additions & 0 deletions scripts/ipo-blog/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
*.manifest
*.spec

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/

# Virtual environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# IDEs
.idea/
.vscode/
*.swp
*.swo
*~
.DS_Store

# Project specific
output/
logs/
*.log

# Database
*.db
*.sqlite3

# Temporary files
*.tmp
*.bak
.~*

# Jupyter Notebook
.ipynb_checkpoints

# pyenv
.python-version

# Environments
.env.local
.env.*.local

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# pytype static type analyzer
.pytype/

# Cython debug symbols
cython_debug/
1,123 changes: 1,123 additions & 0 deletions scripts/ipo-blog/38_page.html

Large diffs are not rendered by default.

3,676 changes: 3,676 additions & 0 deletions scripts/ipo-blog/38comm_sample.html

Large diffs are not rendered by default.

Empty file.
Empty file.
138 changes: 138 additions & 0 deletions scripts/ipo-blog/db/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
# IPO Blog 데이터베이스 관리

Liquibase를 사용하여 데이터베이스 스키마를 버전 관리합니다.

## 필요 사항

1. **Liquibase 설치**
```bash
brew install liquibase # macOS
# 또는 https://www.liquibase.org/download 에서 다운로드
```

2. **MySQL Connector 설치**
```bash
# lib 디렉토리에 MySQL Connector JAR 파일 다운로드
cd db/lib
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-j-8.4.0.jar
```

3. **환경변수 설정**
```bash
export IPO_MYSQL_HOST=stock-api.advenoh.pe.kr
export IPO_MYSQL_PORT=10024
export IPO_MYSQL_DATABASE=ipo
export IPO_MYSQL_USER=ipo
export IPO_MYSQL_PASSWORD=your_password
```

## 디렉토리 구조

```
db/
├── changelog.yaml # 마스터 changelog 파일
├── liquibase.properties # Liquibase 설정
├── liquibase.sh # 실행 스크립트
├── changelog/ # SQL 변경사항
│ └── 2025-06/ # 날짜별 디렉토리
│ ├── 1_init.sql # 초기 테이블 생성
│ ├── 2_add-indexes.sql # 인덱스 추가
│ └── 3_insert-initial-data.sql # 초기 데이터
├── lib/ # 의존성 라이브러리
│ └── mysql-connector-j-8.4.0.jar
├── scripts/ # 유틸리티 스크립트
│ └── mysql_backup.sh # 백업 스크립트
└── README.md # 이 파일

```

## 사용 방법

### 1. DB 상태 확인
```bash
cd db
./liquibase.sh status
```

### 2. 변경사항 적용
```bash
# 모든 변경사항 적용
./liquibase.sh update-all

# 한 개씩 적용
./liquibase.sh update-one
```

### 3. 롤백
```bash
# 마지막 변경사항 1개 롤백
./liquibase.sh rollback-one

# 특정 태그로 롤백
./liquibase.sh rollback-tag <tag-name>
```

### 4. 히스토리 확인
```bash
./liquibase.sh history
```

### 5. 태그 생성
```bash
./liquibase.sh tag release-1.0
```

### 6. 백업
```bash
cd scripts
./mysql_backup.sh
```

## 새로운 변경사항 추가

1. `changelog/YYYY-MM/` 디렉토리에 새 SQL 파일 생성
2. 파일명은 순서를 나타내는 번호로 시작 (예: `4_add-column.sql`)
3. 파일 형식:
```sql
--liquibase formatted sql
--changeset ipo-blog:#004

-- 변경사항 SQL
ALTER TABLE ipo_info ADD COLUMN new_column VARCHAR(50);

--rollback ALTER TABLE ipo_info DROP COLUMN new_column;
```

## 테이블 구조

### 1. ipo_info (IPO 기본정보)
- stock_code: 종목코드 (PK)
- company_name: 회사명
- market_type: 시장구분
- industry: 업종
- 기타 기본 정보

### 2. financial_info (재무정보)
- 연도별 재무 데이터
- stock_code로 ipo_info와 연결

### 3. offering_info (공모정보)
- 공모가, 청약일정 등
- stock_code로 ipo_info와 연결

### 4. news_info (뉴스정보)
- IPO 관련 뉴스
- sentiment 분석 포함

### 5. posting_history (포스팅이력)
- 블로그 포스팅 생성 이력

### 6. underwriter_list (증권사목록)
- 관심 증권사 목록 관리

## 주의사항

1. **프로덕션 적용 전 반드시 테스트 환경에서 검증**
2. **변경 전 백업 필수**
3. **rollback 스크립트 항상 포함**
4. **외래키 제약조건은 CASCADE 옵션 사용**
7 changes: 7 additions & 0 deletions scripts/ipo-blog/db/changelog.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
databaseChangeLog:
- includeAll:
path: "changelog"
endsWithFilter: ".sql"
minDepth: 2
maxDepth: 2
resourceComparator: "com.arcbrain.liquibase.NaturalOrderComparator"
81 changes: 81 additions & 0 deletions scripts/ipo-blog/db/changelog/2025-06/1_init.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
--liquibase formatted sql
--changeset ipo-blog:#001

-- IPO 정보 테이블
CREATE TABLE IF NOT EXISTS `ipo_info` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`stock_code` VARCHAR(10) UNIQUE NOT NULL COMMENT '종목코드',
`company_name` VARCHAR(100) NOT NULL COMMENT '회사명',
`market_type` VARCHAR(20) COMMENT '시장구분 (코스피/코스닥)',
`company_type` VARCHAR(50) COMMENT '기업구분',
`industry` VARCHAR(100) COMMENT '업종',
`main_products` TEXT COMMENT '주요제품',
`homepage` VARCHAR(255) COMMENT '홈페이지',
`major_shareholder` VARCHAR(100) COMMENT '최대주주',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='IPO 기본정보';

-- 재무 정보 테이블
CREATE TABLE IF NOT EXISTS `financial_info` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`stock_code` VARCHAR(10) NOT NULL COMMENT '종목코드',
`year` INT NOT NULL COMMENT '연도',
`revenue` DECIMAL(15,2) COMMENT '매출액',
`operating_profit` DECIMAL(15,2) COMMENT '영업이익',
`net_profit` DECIMAL(15,2) COMMENT '당기순이익',
`total_debt` DECIMAL(15,2) COMMENT '총부채',
`capital` DECIMAL(15,2) COMMENT '자본금',
FOREIGN KEY (`stock_code`) REFERENCES `ipo_info`(`stock_code`) ON DELETE CASCADE,
UNIQUE KEY `unique_stock_year` (`stock_code`, `year`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='재무정보';

-- 공모 정보 테이블
CREATE TABLE IF NOT EXISTS `offering_info` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`stock_code` VARCHAR(10) NOT NULL COMMENT '종목코드',
`desired_price_min` INT COMMENT '희망공모가 최소',
`desired_price_max` INT COMMENT '희망공모가 최대',
`fixed_price` INT COMMENT '확정공모가',
`underwriters` TEXT COMMENT '주관사',
`total_competition_rate` DECIMAL(10,2) COMMENT '전체경쟁률',
`institutional_competition_rate` DECIMAL(10,2) COMMENT '기관경쟁률',
`retail_allocation` INT COMMENT '일반청약비율',
`institutional_allocation` INT COMMENT '기관청약비율',
`demand_forecast_date` DATE COMMENT '수요예측일',
`subscription_date` DATE COMMENT '청약일',
`payment_date` DATE COMMENT '납입일',
`refund_date` DATE COMMENT '환불일',
`listing_date` DATE COMMENT '상장일',
FOREIGN KEY (`stock_code`) REFERENCES `ipo_info`(`stock_code`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='공모정보';

-- 뉴스 정보 테이블
CREATE TABLE IF NOT EXISTS `news_info` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`stock_code` VARCHAR(10) NOT NULL COMMENT '종목코드',
`title` VARCHAR(500) COMMENT '뉴스제목',
`url` VARCHAR(500) COMMENT '뉴스URL',
`source` VARCHAR(50) COMMENT '뉴스출처',
`published_date` DATETIME COMMENT '발행일시',
`summary` TEXT COMMENT '요약',
`sentiment` VARCHAR(20) COMMENT '감성분석 (긍정/부정/중립)',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
FOREIGN KEY (`stock_code`) REFERENCES `ipo_info`(`stock_code`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='뉴스정보';

-- 포스팅 이력 테이블
CREATE TABLE IF NOT EXISTS `posting_history` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`stock_code` VARCHAR(10) NOT NULL COMMENT '종목코드',
`file_path` VARCHAR(500) COMMENT '파일경로',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
`status` VARCHAR(20) DEFAULT 'completed' COMMENT '상태',
FOREIGN KEY (`stock_code`) REFERENCES `ipo_info`(`stock_code`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='포스팅이력';

--rollback DROP TABLE IF EXISTS `posting_history`;
--rollback DROP TABLE IF EXISTS `news_info`;
--rollback DROP TABLE IF EXISTS `offering_info`;
--rollback DROP TABLE IF EXISTS `financial_info`;
--rollback DROP TABLE IF EXISTS `ipo_info`;
37 changes: 37 additions & 0 deletions scripts/ipo-blog/db/changelog/2025-06/2_add-indexes.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
--liquibase formatted sql
--changeset ipo-blog:#002

-- ipo_info 인덱스
CREATE INDEX idx_ipo_info_company_name ON `ipo_info` (`company_name`);
CREATE INDEX idx_ipo_info_market_type ON `ipo_info` (`market_type`);
CREATE INDEX idx_ipo_info_created_at ON `ipo_info` (`created_at`);

-- financial_info 인덱스
CREATE INDEX idx_financial_info_stock_code ON `financial_info` (`stock_code`);
CREATE INDEX idx_financial_info_year ON `financial_info` (`year`);

-- offering_info 인덱스
CREATE INDEX idx_offering_info_stock_code ON `offering_info` (`stock_code`);
CREATE INDEX idx_offering_info_listing_date ON `offering_info` (`listing_date`);
CREATE INDEX idx_offering_info_underwriters ON `offering_info` (`underwriters`(100));

-- news_info 인덱스
CREATE INDEX idx_news_info_stock_code ON `news_info` (`stock_code`);
CREATE INDEX idx_news_info_published_date ON `news_info` (`published_date`);

-- posting_history 인덱스
CREATE INDEX idx_posting_history_stock_code ON `posting_history` (`stock_code`);
CREATE INDEX idx_posting_history_created_at ON `posting_history` (`created_at`);

--rollback DROP INDEX idx_posting_history_created_at ON `posting_history`;
--rollback DROP INDEX idx_posting_history_stock_code ON `posting_history`;
--rollback DROP INDEX idx_news_info_published_date ON `news_info`;
--rollback DROP INDEX idx_news_info_stock_code ON `news_info`;
--rollback DROP INDEX idx_offering_info_underwriters ON `offering_info`;
--rollback DROP INDEX idx_offering_info_listing_date ON `offering_info`;
--rollback DROP INDEX idx_offering_info_stock_code ON `offering_info`;
--rollback DROP INDEX idx_financial_info_year ON `financial_info`;
--rollback DROP INDEX idx_financial_info_stock_code ON `financial_info`;
--rollback DROP INDEX idx_ipo_info_created_at ON `ipo_info`;
--rollback DROP INDEX idx_ipo_info_market_type ON `ipo_info`;
--rollback DROP INDEX idx_ipo_info_company_name ON `ipo_info`;
22 changes: 22 additions & 0 deletions scripts/ipo-blog/db/changelog/2025-06/3_insert-initial-data.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
--liquibase formatted sql
--changeset ipo-blog:#003

-- 증권사 목록 테이블 생성 (추가)
CREATE TABLE IF NOT EXISTS `underwriter_list` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`underwriter_name` VARCHAR(100) NOT NULL COMMENT '증권사명',
`is_active` BOOLEAN DEFAULT TRUE COMMENT '활성화 여부',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='주관증권사 목록';

-- 증권사 목록 초기 데이터
INSERT INTO `underwriter_list` (`underwriter_name`) VALUES
('미래에셋증권'),
('한국투자증권'),
('신한투자증권'),
('KB증권'),
('NH투자증권'),
('삼성증권');

--rollback DELETE FROM `underwriter_list` WHERE `underwriter_name` IN ('미래에셋증권', '한국투자증권', '신한투자증권', 'KB증권', 'NH투자증권', '삼성증권');
--rollback DROP TABLE IF EXISTS `underwriter_list`;
Loading