第66話 バックエンド開発への挑戦
卓也さんが「まずはバックエンドからだ」と言った瞬間、僕は率直に疑問を口にした。
「バックエンドって、具体的に何をするんですか?」
卓也さんは振り返ると、いつものように少し笑って言った。
「百聞は一見にしかず。実際に動いてるのを見せてやる」
そう言うと、卓也さんは自分のPCに向かい、キーボードをカタカタと叩き始めた。コマンドプロンプトが開かれ、何かのコマンドが実行される。僕には何が起こっているのかよく分からなかったが、卓也さんの手つきは迷いがなく、まるで楽器を演奏するように滑らかだった。
「よし、起動した」
卓也さんがブラウザを開き、アドレスバーに「localhost:3000/users」と入力した。エンターキーを押すと、画面に英語の文字列がズラッと表示された。
「なんか英語でズラッと出てきた!これがAPI?」
「そうだ。これは俺がテスト用に作ったやつだが、バックエンドがやってることの基本がこれだ」
画面には、確かに何かのデータが表示されていた。名前らしきものや、IDのような数字が並んでいる。JSON形式、と卓也さんが言っていたが、僕にはただの英語の羅列に見えた。
「このusersの部分を、水野屋の商品に置き換えて考えてみろ」
卓也さんが画面を指差しながら説明する。
「千尋ちゃんがスマホで商品を見る時、裏でこんな感じでデータを取ってるんだ」
その瞬間、僕の頭の中で何かが繋がった。
「あ!千尋のアプリの裏でこういうのが動いてるのか!」
水野屋のアプリで千尋が商品一覧を見る時、この画面のような仕組みが裏で動いている。千尋がタップする度に、こんなデータのやり取りが発生している。そう考えると、急に身近に感じられた。
「理解できたところで、実際に作ってみるか」
卓也さんが新しいウィンドウを開いた。今度はVisual Studio Codeというエディタだった。
「まずは明確な目標を決めよう。localhost:3000/hello にアクセスすると『Hello World』が返ってくるAPIを作る」
「NestJSのControllerっていう仕組みを使うんだ」
「えっと、これをどう書けば……」
僕は画面を見つめたが、何から手をつけていいのか分からなかった。
「まずはコピペでいい。動く感覚を掴もう」
卓也さんが手本を見せながら、実際にコードを入力し始めた。
画面に以下のようなコードが表示された:
```
import { Controller, Get } from '@nestjs/common';
@Controller()
export class AppController {
@Get('hello')
getHello(): string {
return 'Hello World';
}
}
```
「@Controller()は『このクラスがAPIの窓口です』って意味」
卓也さんが一行ずつ説明してくれる。
「@Get('hello')は『/helloにGETでアクセスされたら、この関数を実行』って意味だ。この場合だと'Hello World'という文字列を返す処理が実行される」
「@マークって何ですか?」
「デコレータっていう、TypeScriptの機能だ。関数やクラスに特別な意味を持たせることができる」
僕は言われた通りにコードをタイピングした。まるで呪文を写しているような気分だった。
「よし、保存したら今度はサーバーを起動するぞ」
卓也さんがターミナルで「npm run start:dev」とコマンドを入力した。画面に何行かの文字が流れて、最後に「Application is running on: http://localhost:3000」と表示された。
「じゃあブラウザで確認してみよう」
卓也さんがブラウザのアドレスバーに「localhost:3000/hello」と入力してエンターキーを押した。
画面に「Hello World」と表示された。
「うわあ!僕が書いたコードが動いてる!」
思わず声を上げてしまった。確かに僕がキーボードを叩いて入力したコードが、ブラウザの画面に結果を表示している。こんな単純なことなのに、なぜか感動的だった。
「これがAPIの基本だ。URLにアクセスすると、関数が実行されて結果が返る」
「今度は水野屋の商品データを返すAPIにしたい!」
成功の興奮で、僕は次々とアイデアが浮かんできた。
「お、やる気出てきたな。じゃあ /products エンドポイントを作ろう」
卓也さんも嬉しそうだった。
「今度は、さっきのコードに追加する形で書いてみよう」
卓也さんが画面上で、先ほどのコードの下に新しい関数を追加し始めた。
```
@Get('products')
getProducts() {
return [
{ id: 1, name: '桜餅', price: 150, category: '季節もの' },
{ id: 2, name: '草餅', price: 130, category: '定番' },
{ id: 3, name: 'あんみつ', price: 200, category: 'デザート' }
];
}
```
「実際の水野屋の商品データを想定して作ってみた」
卓也さんが説明する。
「さっきの『Hello World』は単純な文字列だったけど、今度は配列を返してる。この角括弧『[ ]』が配列で、中括弧『{ }』がオブジェクトだ」
「一つ一つの商品がオブジェクト。それを配列で包んで複数の商品を返すようにしてるんだ」
なるほど、データの構造にも意味があるのか。
「千尋が見るデータを僕が作ってる……」
感動で言葉が詰まった。プログラミングが、急に現実的で特別なものに感じられた。
コードを保存して、サーバーが自動的に再起動する。そして「localhost:3000/products」にアクセスした。
画面に、水野屋の商品データがJSON形式で表示された:
```
[
{"id":1,"name":"桜餅","price":150,"category":"季節もの"},
{"id":2,"name":"草餅","price":130,"category":"定番"},
{"id":3,"name":"あんみつ","price":200,"category":"デザート"}
]
```
桜餅、草餅、あんみつ。どれも千尋の家で実際に売られている商品だった。
「これ、千尋のスマホから見えるやつですよね!」
僕は興奮していた。
「そうだ。千尋ちゃんのアプリが、この裏でこのAPIを呼んでるんだ」
このデータを千尋が見ることになるかもしれない。千尋がスマホをタップして、このデータが表示される。そう思うと、胸が熱くなった。
しばらく画面を見つめていた僕は、ふと疑問に思った。
「卓也さんはどうやってこんなに詳しくなったんですか?」
卓也さんの技術力は、僕から見ると魔法のようだった。どうすればそんな風になれるのだろう。
「筑波大学の情報学群で基礎から学んだんだ」
卓也さんが振り返った。
「大学でちゃんと学べば体系的に理解できる。独学だけじゃ限界があるからな」
「筑波大学の情報学群……僕も行けるかな」
初めて、具体的な大学への憧れを抱いた。今まで大学なんて漠然としたものだったが、卓也さんのような人になれる場所として、急に現実的に感じられた。
「健太なら十分いけるよ。今の調子で頑張れば」
卓也さんの言葉に、僕の心は決まった。千尋のためにプログラミングを学ぶ。そして卓也さんのように技術を身につける。そのために、筑波大学の情報学群を目指そう。
画面には相変わらず水野屋の商品データが表示されていた。桜餅、草餅、あんみつ。千尋が愛する和菓子たちが、今は僕の作ったプログラムの中で輝いて見えた。
僕の技術学習は、今日から本格的に始まったのだった。




