こんにちは!SJC共同開発推進室の中谷です!
今年4月に入社し、最初の3か月間は社外研修でJavaを使ったWeb開発の基礎を学びました。
研修ではServletを中心に学習しましたが、現場復帰後はSpring Bootを使ったWebアプリ開発に取り組んでいます。
最初は戸惑いもありましたが、使っていくうちに「これは便利だな」と感じる場面が増えてきました。
この記事では、私が体験したSpring Bootの便利なところを研修時代に触ったServletと比較しながら紹介していきます。これからSpring Bootに触れる方や、私と同じような境遇の方にとって、少しでも参考になれば嬉しいです!
【簡潔に】Spring Bootってなに?
Spring Bootとは、JavaのWebアプリケーション開発で広く使われているSpring Frameworkを、より簡単に、早く使えるようにするための仕組みです。
難しい設定や必要なライブラリを自分で細かく準備しなくても、必要な機能を選ぶだけで、すぐにアプリを動かせるのが特徴です。
Spring Bootの便利なところ
1. アノテーションベースの書き方でコードが見やすい
Servletでのコーディング
例えば、以下のような機能を持った「社員管理システム」があるとします。
| 機能 | URL |
|---|---|
| 社員一覧表示 | /employee |
| 社員詳細表示 | /employee?id=123 |
| 社員登録 | /employee |
| 社員更新 | /employee?action=update&id=123 |
| 社員削除 | /employee?action=delete&id=123 |
この「社員管理システム」をServletで実装すると以下のようなコードになります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
@WebServlet("/employee") public class EmployeeServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String id = request.getParameter("id"); if (id == null) { // 社員一覧表示 showEmployeeList(request, response); } else { // 社員詳細表示 showEmployeeDetail(request, response, id); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getParameter("action"); if ("update".equals(action)) { updateEmployee(request, response); } else if ("delete".equals(action)) { deleteEmployee(request, response); } else { // 社員登録 createEmployee(request, response); } } } |
❌ 問題点
doGet() や doPost() に処理が集中して、if文やswitch文が増える
メソッド名がdoGet()、doPost()で固定なため、if文やswitch文の分岐をちゃんと見ないと何の処理をしているかわからない
Spring Bootでのコーディング
これがSpring Bootでは、アノテーションベースでHTTPリクエストの種類ごとに処理を定義できるため、以下のようにコード全体がシンプルで見やすくなります!
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
@RestController @RequestMapping("/employee") public class EmployeeController { @Autowired private EmployeeService employeeService; // GET /employee @GetMapping public List<Employee> getAllEmployees() { return employeeService.findAll(); } // GET /employee?id=123 @GetMapping(params = "id") public ResponseEntity<Employee> getEmployeeById(@RequestParam Long id) { return employeeService.findById(id); } // POST /employee @PostMapping public Employee createEmployee(@RequestBody Employee newEmployee) { return employeeService.save(newEmployee); } // POST /employee?action=update&id=123 @PutMapping("/{id}") public Employee updateEmployee(@PathVariable Long id, @RequestBody Employee employeeDetails) { return employeeService.update(id, employeeDetails); } // POST /employee?action=delete&id=123 @DeleteMapping("/{id}") public ResponseEntity<Void> deleteEmployee(@PathVariable Long id) { employeeService.deleteById(id); return ResponseEntity.noContent().build(); // 204 No Content } } |
このように、アノテーションでどのHTTPリクエスト(GETやPOSTなど)に対応する処理なのかを明らかにし、メソッド単位で処理を分けることができるため、Servletで問題だった処理分岐の複雑さが改善されました!
また、Spring BootではServletのdoGet()、doPost()のようにメソッド名が固定ではなく、自由に名付けることができます。
そのため役割に応じた名前を付けることで何をしているメソッドなのかがすぐにわかり、コードを読むときのストレスが減ります。
さらに、今後の機能拡張時にもServletの場合はif文やswitch文で分岐を増やす必要がありますが、Spring Bootではアノテーションを付与してメソッド単位で追記するだけです。
2. DBデータをDTOに自動で詰め替えてくれる
Servletベースの開発からSpring Bootに移行して、最初に「便利だ!」と感じたのがこの「DBのデータをDTOに自動で詰め替えてくれる機能」でした。
この機能はMyBatisによるもので、JavaでDBとやり取りするために用いられるライブラリとして、Spring Bootと組み合わせて使われます。
Servletでの詰め替え処理
研修ではServletで、DBから取得したデータをDTOに詰め替える処理を1行ずつ地道に入力していました。
たとえば、ResultSet から値を取り出して、DTOのメンバ変数に1つずつセットするようなコードです。
👉DTOとは?
データを一時的に入れて、他の処理に渡すための入れ物のようなクラスのこと。
|
1 2 3 4 5 6 7 8 9 |
// DTOの定義 public class EmployeeDto { private int id; private String name; private String email; private String address; // getter / setter は省略 } |
|
1 2 3 4 5 6 7 8 |
// DTOへの手動詰め替え while (resultSet.next()) { EmployeeDto employee = new EmployeeDto(); employee.setId(resultSet.getInt("id")); employee.setName(resultSet.getString("name")); // 他カラムもセット employeeList.add(employee); } |
このような処理は、データ項目が増えるほど書くのが面倒になり、入力ミス・入力漏れのリスクも高くなります。実際、私も度々セット忘れや記述ミスでエラーになっていました。
Spring Boot + MyBatisで自動詰め替え
Spring Bootに移行してからは、MyBatisを使うことで、DBデータのDTO詰め替え作業を自動でしてくれるようになり、実装の手間が大きく減りました。
こうした自動化を可能にしているのが、MyBatisのMapperインターフェースです。
MyBatisでは、DBから情報を取り出したり保存するためにMapperインターフェースを使います。
Mapperインターフェースは、「このメソッドを呼び出したら、このSQLを実行してね」というルールを決める場所です。
また、あらかじめ「このSQLの結果を、このDTOに入れてね」とMapperで定義しておくと、SQLの実行結果を自動的にDTOに詰め替えてくれます!
たとえば、Mapperに以下のような「SQL文を実行するためのメソッド」を記述するだけで…
|
1 2 3 4 5 6 |
@Mapper public interface EmployeeMapper { @Select("SELECT * FROM employees") List<EmployeeDto> getEmployeeList(); } |
SQLで取得したemployeesテーブルのカラムを、自動でEmployeeDtoの各メンバ変数に詰め替えてくれます!
また、こんな便利な機能を使うのに必要な条件は以下の2つだけです。
- DTOのメンバ変数名とSQLのカラム名が一致していること
- DTOにgetter/setterが定義されていること
なお、DTOのメンバ変数名とSQLのカラム名が完全に一致していなくても、アンダースコア(snake_case)とキャメルケース(camelCase)の違いはMyBatisが自動で変換してくれます。
たとえば、SQL側が employee_name というカラム名で、DTO側で employeeName というメンバ変数名にしておけば、MyBatisが自動で対応してくれます。
この2つの条件さえ守れば、億劫なDTOへの詰め替え作業から解放され、セットミスやセット漏れのリスクも防ぐことができます。
そして、本来この作業でかかるはずだった時間を、自分の書いたコード全体の見直し時間に充てられるようになったことが一番のメリットだなと感じています!
まとめ
いかがだったでしょうか?
ServletでWeb開発の基礎を学んだことで、Spring Bootの便利さをより深く実感することができました。もし最初からSpring Bootを使っていたら、何が便利なのかをよく理解できていなかったと思います。
私は、「そのフレームワークの何が便利なのか」や「なぜその機能が作られたのか」といった背景を理解してこそ、本当の意味で使いこなせると考えています。
そのため、今後も便利なフレームワークや機能に出会ったときには「なぜ便利なのか」とその背景も含めて学んでいきたいと思います!
最後までお読みいただき、ありがとうございました。
エコモットでは一緒にモノづくりをしていく仲間を随時募集しています。弊社に少しでも興味がある方はぜひ下記の採用ページをご覧ください!

