インポート機能、エクスポート機能APIの作り方（Node.js、Springboot）

今回はインポート機能、エクスポート機能APIの作り方を記事にしました。


インポート機能とエクスポート機能を実装するAPIの作り方をステップバイステップで説明します。一般的には、CSVやExcel形式でデータをインポートしたりエクスポートしたりする機能がよく使われます。今回は、Node.jsのExpressとJavaのSpring Boot、データベースとしてMySQLを使った場合の例で解説します。

# 1. Node.js（Express）を使ったAPIの実装例
必要なライブラリのインストール
まず、必要なライブラリをインストールします。expressはサーバーを構築するために使用し、csv-parserはCSVファイルの読み込みに、json2csvはJSONデータをCSVに変換するために使います。

```bash
npm install express csv-parser json2csv multer mysql2
express: APIサーバー
csv-parser: CSVファイルを読み込むためのライブラリ
json2csv: JSONデータをCSVに変換するためのライブラリ
multer: ファイルアップロード用のミドルウェア
mysql2: MySQLと接続するためのライブラリ
```

ファイル構成
- index.js
- uploads/ (インポートするCSVファイルを保存するフォルダ)

# 1.1 インポートAPIの作成
まず、CSVファイルからデータをインポートするAPIを作成します。multerでアップロードされたファイルを処理し、csv-parserを使ってCSVを読み込み、データベースに保存します。

```javascript
const express = require('express');
const mysql = require('mysql2');
const multer = require('multer');
const csv = require('csv-parser');
const fs = require('fs');

const app = express();
const upload = multer({ dest: 'uploads/' });

const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'test_db'
});

// インポートAPI
app.post('/import', upload.single('file'), (req, res) => {
  const filePath = req.file.path;

  const results = [];

  fs.createReadStream(filePath)
    .pipe(csv())
    .on('data', (data) => results.push(data))
    .on('end', () => {
      results.forEach(row => {
        const { name, age, email } = row;
        connection.query(
          'INSERT INTO users (name, age, email) VALUES (?, ?, ?)',
          [name, age, email],
          (err) => {
            if (err) throw err;
          }
        );
      });
      res.send('CSVファイルからデータをインポートしました');
    });
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});
```


# 1.2 エクスポートAPIの作成
次に、データベースからデータを取得して、CSVファイルとしてエクスポートするAPIを作成します。json2csvを使ってデータをCSV形式に変換します。

```javascript
const { Parser } = require('json2csv');

// エクスポートAPI
app.get('/export', (req, res) => {
  connection.query('SELECT * FROM users', (err, results) => {
    if (err) throw err;

    const json2csvParser = new Parser();
    const csvData = json2csvParser.parse(results);

    res.header('Content-Type', 'text/csv');
    res.attachment('export.csv');
    res.send(csvData);
  });
});
```


サーバーの起動
以下のコマンドでサーバーを起動します。

```bash
node index.js
```
これで、CSVファイルをインポートする/importエンドポイントと、CSVとしてデータをエクスポートする/exportエンドポイントが使えるようになります。

# 2. Spring Bootを使ったAPIの実装例
次に、JavaのSpring Bootを使ってインポート・エクスポートAPIを作成する方法です。ここでは、Apache POIライブラリを使用してExcelやCSVの処理を行います。

必要な依存関係（pom.xml）
```xml
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
    </dependency>
</dependencies>
```

# 2.1 エンティティの定義

```java
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private Integer age;
    private String email;

    // getters and setters
}
```


# 2.2 インポートAPIの作成
Spring Bootでファイルをアップロードし、データをMySQLにインポートします。

```java
@RestController
@RequestMapping("/api")
public class ImportExportController {

    @Autowired
    private UserRepository userRepository;

    @PostMapping("/import")
    public ResponseEntity<String> importData(@RequestParam("file") MultipartFile file) {
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream()))) {
            String line;
            while ((line = reader.readLine()) != null) {
                String[] data = line.split(",");
                User user = new User();
                user.setName(data[0]);
                user.setAge(Integer.parseInt(data[1]));
                user.setEmail(data[2]);
                userRepository.save(user);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return ResponseEntity.ok("データをインポートしました");
    }
}
```

# 2.3 エクスポートAPIの作成
データベースのデータをCSVとしてエクスポートするAPIです。

```java
@GetMapping("/export")
public void exportData(HttpServletResponse response) throws IOException {
    response.setContentType("text/csv");
    response.setHeader("Content-Disposition", "attachment; filename=\"users.csv\"");

    List<User> users = userRepository.findAll();

    PrintWriter writer = response.getWriter();
    writer.write("ID,Name,Age,Email\n");
    for (User user : users) {
        writer.write(user.getId() + "," + user.getName() + "," + user.getAge() + "," + user.getEmail() + "\n");
    }
}
```
2.4 Spring Bootサーバーの起動
```bash
mvn spring-boot:run
```
これで、CSVファイルをインポートする/api/importエンドポイントと、データをエクスポートする/api/exportエンドポイントが作成されました。

まとめ
インポート機能：CSVファイルをアップロードし、データをデータベースに保存します。
エクスポート機能：データベースのデータをCSVやExcelファイルとしてダウンロードします。
Node.jsとSpring Bootの両方で、APIの作り方を紹介しましたが、目的に合わせて適切なフレームワークやライブラリを選び、実装してください。
これで、基本的なインポート・エクスポートAPIの実装が可能です。

今回はインポート機能、エクスポート機能APIの作り方を記事にしました。
基本毎日更新していますので、@y-t0910をフォローしていただけると嬉しいです。