Java, Spring Bootで勉強時間管理アプリを作ってみた。 クラス解説(1)

Java, Spring Bootで勉強時間管理アプリを作ってみた。
製作期間：2022年10月2日から
開発環境：Java, Spring Boot, Mybatis, HTML, CSS

・実装した画面
ユーザーがした課題を見るホーム画面
マイページ（自分の過去にした課題の一覧と課題の登録画面）
ログイン画面
会員登録画面
便利機能（就活の企業分析をする画面）
ログアウト

・LoginUserクラス
```java:LoginUser.class
   //packageは省略 
   //importは省略

@Data
public class LoginUser implements UserDetails{
    private int id;
    private String mailaddress;
    private String username;
    private String password;
    private String roleName;

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return AuthorityUtils.createAuthorityList(this.getRoleName());
    }

    @Override
    public String getUsername() {
        return username;
    }

    @Override
    public String getPassword() {
        return password;
    }


    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}
```

このクラスはログインに使いたい情報、認可、その他アカウントをロックする条件などを決めるクラスである。
Lombokの@Dataを使うことによってゲッターやセッターを省略。
今回ではid, mailaddress, username(ログインに使用), password(ログインに使用), roleName(認可)。

・Controllerクラス
```java:Controller.class
   //packageは省略 
   //importは省略

@Controller
public class Controller {
    @RequestMapping("/mypage/{username}")
    public Object userPage(ModelAndView mav,
                           @PathVariable("username") String username,
                           @AuthenticationPrincipal LoginUser loginUser) {

        if(loginUser == null) {
            mav = new ModelAndView("userpage");
            mav.addObject("TimeList", timekeepMapper.principalSelectAll(username));
            return mav;
        } else {
            LoginUser record = loginUserMapper.findByUsername(username);
            String principalUsername = loginUser.getUsername();

            if (record == null) {
                return "NullAccount";
            } else if (username.equals(principalUsername)) {
                mav = new ModelAndView("PrincipalUserPage");
                mav.addObject("LoginList", principalUsername);
                mav.addObject("PrincipalTimeList", timekeepMapper.principalSelectAll(username));
                return mav;
            } else {
                mav = new ModelAndView("userpage");

                mav.addObject("TimeList", timekeepMapper.principalSelectAll(username));
                return mav;
            }
        }

    }
```

解説：Controllerクラスでは、URLとそこでの処理を書いていく。
今回では
@RequestMapping("/")
これがURLの設定となる
これにより、URLに"/"を入力するとここで設定したHTMLのページに飛ばすということができる。

ModelAndView
これはHTMLに表示させる文字などを変数で登録したいときに使用する。
まず初めに "ModelAndView 付けたい名前(今回はmav)"を宣言
 そして mav = new ModelAndView("表示させたいHTMLファイル");
　これにより紐づけるHTMLファイルを設定することができる。
        
    そしてmav.addObject("HTMLで設定する変数名", 変数名);
       これによって変数とHTMLで紐づけることができる。

RequestMapping("/{変数のURL}")
＠PathVariable("変数のURL") String 変数名
PathVariableはURLに変数を設定することができる。
何も設定しなければ、URLにどんな文字、数字を入れても設定したHTMLページに行くようになる。

今回では
"RequestMapping("/mypage/{username}")
@PathVariable("username") String username(変数名)"とし、
詳しくは後述するが、
if文によってusernameと現在ログインしているusernameが一致すれば、タスク等が編集が可能なユーザーページに飛ばし、
そうでなければ、usernameとデータベース上にあるusernameが一致するか確認し、一致すればタスク等の編集はできないがそのユーザーのページに飛ばし、
その両方に当てはまらないusernameが入力されると、アカウントが見つからないというページに飛ばすようにしている。

@AuthenticationPrincipal LoginUser loginuser
⇒このAuthenticationPrincipalアノテーションは、ログイン中のアカウントの情報を得ることができる。
初めのif文では、loginUserがnullかどうかによってログイン中かそうでないかを判別して、ログイン中でなければ匿名用のHTMLへ、そうでなければ次の分岐（ログインユーザー用のHTML）へ飛ばすようにしている。

さらに今回では、loginUser.getUsername()というゲッターによってログイン中のユーザーネームを確認している。
これによってログイン中のユーザーネームと入力されたユーザーネームが一致するか確認できる。つまり、本人しか入ることができないページを作ることができる。
その方法として、マイページに入る際URLに入力されたユーザーネームとログイン中のユーザーネームが一致する時、編集可能な特別なマイページに飛ばし、URLに入力されたユーザーネームとログイン中のユーザーネームが一致しない場合、編集不可能な閲覧のみのマイページに飛ばすということをしている。

最初のelse以下のif(record == null)は、入力されたユーザーネームが存在するかどうか確認し、それがnullであれば「アカウントが存在しない」という旨のページに飛ばすための文である。