1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

初学者がアノテーションと戦う(SpringBoot)

Last updated at Posted at 2023-12-05

はじめに

Javaの学習を1か月ほど行った後、
1週間ほど前からSpringBootの勉強を始めました。

だがしかし、どうにもSpringBootがわからん。

アノテーションっていっぱい種類あるんだなぁ・・・。

この記事でまとめて覚える。

アノテーションって何者?

@RestController」など「@」から始まる記述。
ここに記述している内容はここで使うものだよ~っていうのを明示する方法。

例えばクラスのまえに「@Controller」とつけると、そのクラスはControllerとして読み込まれる。
@RequestParam("/api")」とつけるとURLに応じた処理を記述することができる。

そのように、機能を簡単にまとめることができる方法。

簡単に・・・・・・・?

初学者の自分の所感は複雑だなぁ・・・という印象。
おそらくこの「簡単に」というのは初学者が理解しやすいという意味ではなく
アノテーションがなければもっと複雑な記述になってしまうが、
アノテーションを用いることでわかりやすくするという意味。

なので、アノテーションならではの、作法や記述方法をしっかりとおさえることが大前提。
つまり書き方がわからないとアノテーションも意味が分からない。

コードを読み解く際に「どういう意味?これはJavaがわからない?SpringBootがわからない?」
それを防ぐためには1つ1つ噛み砕いていく必要がある。

この記事では、初学者の自分がアノテーションを自分なりに考えてまとめて
わかることを増やしていこうという目的で記録していく。

アノテーションを詳しく見ていく

@RestController @Controller

MVCモデルのC部分(コントローラー部分)であることを示すアノテーション
アプリを実行する際にはこちらが読まれて、ViewやModelを動かす。

@RestController@Controllerの違いはデータの受け方、返し方にある。
@RestControllerはResponseBodyに返す。Jsonやxmlを返す場合に使う
@ControllerでJsonやxmlを返したい場合にはメソッドに@ResponseBodyをつける必要がある。

@ResponseBodyを付けずにJsonやxmlを返したい場合に使うのが@RestController

つまり、REST APIを構築するうえでデータ返却をする際にJson形式などの統一を図る際に
@RestControllerを使用するという認識でOK!(REST APIの統一インターフェイスに該当する部分)

▼参考にしたサイト

@ControllerAdvice

Controllerの補助的な役割をするクラスにつけるアノテーション。

エラー処理(@ExceptionHandler)などの例外処理を記述しておくことができるイメージ。
Controller内に@ExceptionHandlerを定義し、例外処理を記述することも可能ではあるが
このように@ControllerAdviceを利用し、別クラスで定義するのが一般的らしい。

製品開発となると、複数人での開発が前提となるので可能な限り複数人での開発ができるように
機能ごとにクラスを分けるという機能を果たす側面もあると思う。

▼参考にしたサイト

@RequestMapping

URLに応じた処理を記述するアノテーション。@RequestMapping("/aaa")と記述するのが基本。
(/aaa)はURLの末尾。つまりローカル環境であればhttp://localhost:8080/aaaの処理を指す。

メソッドを指定しない場合のHTTPメソッドのデフォルト値は「GET」

@RequestMapping(path = "/input", method = POST)のようにメソッドを指定するとHTTPメソッドが指定したものに変わる。
本例はmethod=POSTとなっているのでPOSTメソッドとして処理される。

@RequestMapping記述例1
@RequestMapping(value="/success")
public String index() {
	return"アクセス成功です";
}
//http://localhost:8080/successで「アクセス成功です」が返り値として返る
@RequestMapping記述例2
@RestController
@RequestMapping("/test")
public class practice_controller {

    @RequestMapping(value="/success")
    public String index() {
    	return"アクセス成功です";
    }
    
}
//クラス全体に「/test」、indexメソッドに「/success」を付与
//http://localhost:8080/test/successで「アクセス成功です」が返り値として返る

@GetMapping,@PostMapping,@PutMapping,@DeleteMappingなど
HTTPメソッドを含めたアノテーションも存在する。

▼参考にしたサイト

@RequestParam

値を取得するアノテーションの種類の1つ
値を取得するアノテーションは@PathVariableなどいろいろあるがそのうちのひとつ。

http://localhost:8080/test?param=aaaのようにURLに含まれる?param=から値を取得する。

@RequestParam記述例1
//http://localhost:8080/test?param=あいうえお
//URLの「?param=あいうえお」部分を受け取れる
@RequestMapping("/test")
private String testRequestParam( @RequestParam String param ) {
    return "受け取ったパラメーター:" + param;
}
//「受け取ったパラメーター:あいうえお」と返り値を返す。
@RequestParam記述例2
//http://localhost:8080/test?param=あいうえお&num=111
//URLの「?param=あいうえお&num=111」部分を受け取れる
@RequestMapping("/test")
private String testRequestParam( @RequestParam String param , @RequestParam String num ) {
    return "受け取ったパラメーター:" + param + num;
}
//「受け取ったパラメーター:あいうえお111」と返り値を返す。

ただ、@RequestParamだと1つ1つパラメーターを定義しないといけないの手間だよね。

private String testRequestParam( @RequestParam String param , @RequestParam String num )
これ、2個だからそこまで長くないけど

private String testRequestParam( @RequestParam String param , @RequestParam String num , @RequestParam int id , @RequestParam String text)
4つの変数を登録するだけでこの長さ。見るだけで読みたくない・・・。煩雑。

というので、クラスに変数を前もって登録しておく方法がDTOという方式。
注意:コントローラー内に記述するのではなく、扱うデータ種を別クラスで定義するってこと。

DTOクラスはデータを転送するためのクラス。
DAOクラスと実行用クラスの間にあるイメージのクラス。

実行クラスからModelに対してHTTPメソッドを実施する場合にはDTOクラスに対して行う
DTOクラスがモデルとの橋渡しになる。

DTOクラス
public class SampleDataParam{
String id;
String firstName;
String lastName;
int age;

public SampleDataParam(){
  }
}

//各変数にgeterとsetterも必要!!!!!!!!!!!!!!!!!!

▼参考にしたサイト

@ModelAttribute

DTOの値に対して、HTTPメソッドのGETメソッドを実行したい際に@ModelAttributeを引数につける。
Attributeは「~のせいにする」という意味。Modelとのつながりを発生させるという理解でOK。

@ModelAttribute記述例
@GetMapping
    public SampleData get(@ModelAttribute SampleDataParam param) {
        //...
}

@RequestBody

HTTPメソッドのPOSTメソッドなどのでデータを追加や編集をする際に使う。

@RequestBody記述例
@PostMapping
public void create(@RequestBody SampleDataParam param) {
    //...
}

@PathValiable

URLからパラメーターを受け取るアノテーションの1つ。
似たアノテーションに@RequestParamがある。

http://localhost:8080/test/5/5部分をパラメーターとして受け取れる。

//http://localhost:8080/test/5
//@Pathvariableは「/5」みたいな情報をURLから情報を取得する

@RequestMapping("/test/{param}")
private String testPathVariable( @PathVariable String param ) {
    return "受け取ったパラメータ:" + param;
}

//「受け取ったパラメータ:5」と返り値を返す。

Lombokって便利なライブラリがあるらしい

形式的に書かないといけない「冗長コード」を削減するためのもの。

冗長コードを削減・・・?どういうこっちゃ・・・?

めっちゃ簡単に言うと、使えるアノテーションが増える!!!!ってこと。
いろいろあるが自身が便利だと感じたアノテーションを記述していくことにする。

▼参考にしたサイト

@Getter @Setter

本来メンバー変数に対してアクションを起こすときは
getterメソッドとsetterメソッドで、メンバー変数への道を作っておく必要があるが
それらを省略することができるアノテーション。

こ、これは便利やでぇ・・・。

GetterとSetterって見た目めちゃぐちゃぐちゃになるし、わかりにくいって思ってた。

@Getter/@Setterの記述例
package sample.lombok;

import lombok.Getter;
import lombok.Setter;

public class Main {

    public static void main(String... args) {
        Main m = new Main();
        
        m.setValue("Hello @Getter, @Setter");
        System.out.println(m.getValue());
    }
    
    @Getter @Setter
    private String value;
}

//メンバー変数の上に書く

@NoArgsConstructor @RequiredArgsConstructor @AllArgsConstructor

メンバー変数への値の代入するコンストラクタの作成を省略させてくれるもの。
詳しくは別記事にまとめたのでそちらを参照

随時更新

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?