😎

Re:ゼロから始めるSpring Boot #5 ブログサイト作成1

2023/12/05に公開

要件

  1. ユーザ
    1.1 新規登録 ← 本記事の内容
    1.2 ログイン
    1.3 ユーザ情報取得
    1.4ユーザ情報更新
    1.5 アバター画像変更
    1.6 パスワード変更
  2. 記事カテゴリ
    2.1 記事のカテゴリ一覧取得
    2.2 記事のカテゴリ追加
    2.3 記事のカテゴリ更新
    2.4 記事のカテゴリ詳細取得
    2.5 記事のカテゴリ削除
  3. 記事管理
    3.1 記事新規追加
    3.2 記事更新
    3.3 記事の詳細情報取得
    3.4 記事の削除
    3.5 記事一覧取得

アーキテクチャ

├───RezeroSbWebblogApplication.java
├───controller
│       UserController.java
├───model
│       Result.java
│       User.java
├───repository
│       UserMapper.java
├───service
│   │   UserService.java
│   │
│   └───impl
│           UserServiceImpl.java
└───utils
    └───Md5Util.java

開発環境

  • Java 17
  • Maven 3.1.3
  • 依存パッケージ(artifactId)
    • spring-boot-starter-web
    • mybatis-spring-boot-starter
    • mysql-connector-j
    • spring-boot-starter-test
    • mybatis-spring-boot-starter-test
    • lombok

実装

(1). Userエンティティ

lombokを利用しているため、@Dataアノテーションを利用することでgetter/setterなどを手動追加しなくてもよい。

@Data
public class User {
    private Integer id;
    private String username;
    private String password;
    private String nickname;
    private String email;
    private String userPic;
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
}

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Result<T> {
    private Integer code;//処理結果  0-成功  1-失敗
    private String message;//メッセージ
    private T data;//レスポンスデータ

    //レスポンス処理
    public static <E> Result<E> success(E data) {
        return new Result<>(0, "操作完了", data);
    }

    //快速返回操作成功响应结果
    public static Result success() {
        return new Result(0, "操作完了", null);
    }

    public static Result error(String message) {
        return new Result(1, message, null);
    }
}

(2). Service

public interface UserService {
    User findByUserName(String username);

    void register(String username, String password);
}

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    @Override
    public User findByUserName(String username){
        User u = userMapper.findByUserName(username);
        return u;
    }

    @Override
    public void register(String username, String password){
        String md5String = Md5Util.getMD5String(password);
        userMapper.add(username,md5String);
    }
}

(3). Mapper

@Mapper
public interface UserMapper {
    @Select("select * from user where username=#{username}")
    User findByUserName(String username);

    @Insert("insert into user(username,password,create_time,update_time)" +
            " values(#{username},#{password},now(),now())")
    void add(String username, String password);
}

(4). Controller

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @PostMapping("/register")
    public Result register(String username, String password) {
        User u = userService.findByUserName(username);
        if (u == null){
            userService.register(username,password);
            return Result.success();
        }else{
            return Result.error("既に存在する。");
        }
    }
}

(5). その他(Utils)

パスワードを暗号化するために利用する。
こちらを参照。
https://github.com/litesuits/android-common/blob/master/app/src/main/java/com/litesuits/common/utils/MD5Util.java

(6). データベースの準備

create table user
(
    id          int unsigned auto_increment comment 'ID'
        primary key,
    username    varchar(20)             not null comment 'UserName',
    password    varchar(32)             null comment 'PassWord',
    nickname    varchar(10)  default '' null comment 'NickName',
    email       varchar(128) default '' null comment 'MailAddress',
    user_pic    varchar(128) default '' null comment 'Avator',
    create_time datetime                not null comment 'CreateDate',
    update_time datetime                not null comment 'ModifyDate',
    constraint username
        unique (username)
)

comment 'UserTable';

テスト

網羅してはいないが、コントローラーの動作確認を行う。

@SpringBootTest
@AutoConfigureMockMvc
class RezeroSbWebblogApplicationTests {

	@Autowired
	private MockMvc mockMvc;
	@Autowired
	private ObjectMapper objectMapper;

	@Test
	public void testRegister() throws Exception {
		// テストデータ
		String username = "testusertest";
		String password = "testpasswordtes";

		// リクエストを送信して結果を検証
		String resultJson = mockMvc.perform(MockMvcRequestBuilders.post("/user/register")
						.param("username", username)
						.param("password", password))
				.andExpect(MockMvcResultMatchers.status().isOk())
				.andReturn()
				.getResponse()
				.getContentAsString(StandardCharsets.UTF_8); // UTF-8 エンコーディング指定

		// Resultオブジェクトに変換
		Result<?> result = objectMapper.readValue(resultJson, Result.class);

		// 検証
		Assertions.assertEquals(0, result.getCode()); // 成功コード
		Assertions.assertEquals("操作完了", result.getMessage()); // メッセージ
		Assertions.assertNull(result.getData()); // データが不要な場合はnull
	}
}

テスト結果

Discussion