To create a TypeScript Node.js application that connects to a MySQL database and exposes data through a REST API endpoint, you will need to follow these steps:

1. Install the required dependencies
2. Set up the project structure
3. Configure the MySQL connection
4. Create the products table in your MySQL database
5. Implement the REST API with pagination and filtering

Here's a step-by-step guide on how to do this:

### 1. Install the required dependencies

First, initialize a new Node.js project and install the necessary dependencies:

```bash
npm init -y
npm install express mysql2 body-parser cors dotenv typescript ts-node @types/node @types/express @types/mysql2 @types/body-parser @types/cors
```

Next, create a `tsconfig.json` file for TypeScript configuration:

```json
{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "outDir": "./dist",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": ["src/**/*.ts"],
  "exclude": ["node_modules"]
}
```

### 2. Set up the project structure

Create a `src` folder and add the following files:

- `index.ts`: The main entry point of the application.
- `database.ts`: Handles the MySQL connection.
- `productController.ts`: Contains the logic for retrieving products from the database.

### 3. Configure the MySQL connection

Create a `.env` file at the root of your project and fill it with your MySQL credentials:

```
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=your_password
DB_NAME=my_database
```

In `src/database.ts`, set up the MySQL connection using the `mysql2` library:

```typescript
import { createPool, Pool } from 'mysql2/promise';
import * as dotenv from 'dotenv';

dotenv.config();

const pool: Pool = createPool({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME,
});

export default pool;
```

### 4. Create the products table in your MySQL database

Create a new table named "products" with the following columns:

- `id`: INT AUTO_INCREMENT PRIMARY KEY
- `name`: VARCHAR(255)
- `price`: DECIMAL(10, 2)

You can use a tool like phpMyAdmin or run an SQL query to create this table.

### 5. Implement the REST API with pagination and filtering

In `src/productController.ts`, implement the logic for retrieving products from the database with pagination and price range filtering:

```typescript
import { Request, Response } from 'express';
import pool from './database';

export const getProducts = async (req: Request, res: Response) => {
  try {
    const page = parseInt(req.query.page as string) || 1;
    const limit = parseInt(req.query.limit as string) || 10;
    const minPrice = parseFloat(req.query.minPrice as string) || 0;
    const maxPrice = parseFloat(req.query.maxPrice as string) || Number.MAX_VALUE;

    const offset = (page - 1) * limit;

    const [rows] = await pool.execute(
      'SELECT * FROM products WHERE price >= ? AND price <= ? LIMIT ?, ?',
      [minPrice, maxPrice, offset, limit]
    );

    res.status(200).json(rows);
  } catch (error) {
    console.error(error);
    res.status(500).send('Server error');
  }
};
```

Finally, in `src/index.ts`, set up the Express server and define the API endpoint:

```typescript
import express from 'express';
import bodyParser from 'body-parser';
import cors from 'cors';
import { getProducts } from './productController';

const app = express();
app.use(bodyParser.json());
app.use(cors());

app.get('/api/products', getProducts);

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});
```

Now you can run your TypeScript Node.js application using the following command:

```bash
npx ts-node src/index.ts
```

Your REST API will be available at `http://localhost:3000/api/products` with support for pagination (using `page` and `limit` query parameters) and price range filtering (using `minPrice` and `maxPrice` query parameters).
MySQL 데이터베이스에 연결하고 REST API 엔드포인트를 통해 데이터를 노출하는 TypeScript Node.js 애플리케이션을 만들려면 다음 단계를 따라야 합니다.

1. 필요한 종속성 설치
2. 프로젝트 구조 설정
3. MySQL 연결 구성
4. MySQL 데이터베이스에 제품 테이블을 생성합니다
5. 페이지 매김 및 필터링으로 REST API 구현

이 작업을 수행하는 방법에 대한 단계별 가이드는 다음과 같습니다.

### 1. 필요한 종속성 설치

먼저, 새 Node.js 프로젝트를 초기화하고 필요한 종속성을 설치합니다:

```bash
npm init -y
npm install express mysql2 body-parser cors dotenv typescript ts-node @types/node @types/express @types/mysql2 @types/body-parser @types/cors
```

다음으로, TypeScript 구성을 위한 `tsconfig.json` 파일을 생성합니다:

```json
{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "outDir": "./dist",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": ["src/**/*.ts"],
  "exclude": ["node_modules"]
}
```

### 2. 프로젝트 구조 설정

`src` 폴더를 생성하고 다음 파일을 추가합니다:

- `index.ts`: 애플리케이션의 주요 진입점입니다.
- `database.ts`: MySQL 연결을 처리합니다.
- `productController.ts`: 데이터베이스에서 제품을 검색하는 로직이 포함되어 있습니다.

### 3. MySQL 연결 구성

프로젝트 루트에 `.env` 파일을 생성하고 MySQL 자격 증명으로 채웁니다:

```
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=your_password
DB_NAME=my_database
```

`src/database.ts`에서 `mysql2` 라이브러리를 사용하여 MySQL 연결을 설정합니다:

```typescript
import { createPool, Pool } from 'mysql2/promise';
import * as dotenv from 'dotenv';

dotenv.config();

const pool: Pool = createPool({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME,
});

export default pool;
```

### 4. MySQL 데이터베이스에 제품 테이블 생성

다음 열을 사용하여 "products"라는 이름의 새 테이블을 생성합니다:

- `id`: INT AUTO_INCREMENT PRIMARY KEY
- `name`: VARCHAR(255)
- `price`: DECIMAL(10, 2)

phpMyAdmin과 같은 도구를 사용하거나 SQL 쿼리를 실행하여 이 테이블을 생성할 수 있습니다.

### 5. 페이지 매김 및 필터링이 있는 REST API 구현

`src/productController.ts`에서 페이지 매김 및 가격대 필터링을 사용하여 데이터베이스에서 제품을 검색하는 로직을 구현합니다:

```typescript
import { Request, Response } from 'express';
import pool from './database';

export const getProducts = async (req: Request, res: Response) => {
  try {
    const page = parseInt(req.query.page as string) || 1;
    const limit = parseInt(req.query.limit as string) || 10;
    const minPrice = parseFloat(req.query.minPrice as string) || 0;
    const maxPrice = parseFloat(req.query.maxPrice as string) || Number.MAX_VALUE;

    const offset = (page - 1) * limit;

    const [rows] = await pool.execute(
      'SELECT * FROM products WHERE price >= ? AND price <= ? LIMIT ?, ?',
      [minPrice, maxPrice, offset, limit]
    );

    res.status(200).json(rows);
  } catch (error) {
    console.error(error);
    res.status(500).send('Server error');
  }
};
```

마지막으로 `src/index.ts`에서 Express 서버를 설정하고 API 엔드포인트를 정의합니다:

```typescript
import express from 'express';
import bodyParser from 'body-parser';
import cors from 'cors';
import { getProducts } from './productController';

const app = express();
app.use(bodyParser.json());
app.use(cors());

app.get('/api/products', getProducts);

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});
```

이제 다음 명령을 사용하여 TypeScript Node.js 애플리케이션을 실행할 수 있습니다:

```bash
npx ts-node src/index.ts
```

페이지 매김(`page` 및 `limit` 쿼리 매개변수 사용) 및 가격 범위 필터링(`minPrice` 및 최대 가격` 쿼리 매개변수 사용)을 지원하는 REST API는 `http://localhost:3000/api/products`에서 사용할 수 있습니다.