Rental Application (React & Spring boot Microservice) - 5 : AUTH-SERVICE(2)

8906 ワード

#0 DateUtil


Utilは、後でデータベースに保存する現在の日付を示します.クラスを作成するためにutilというパッケージを別途作成します.
public class DateUtil {
    public static String dateNow() {
        return new SimpleDateFormat("yyyy년 MM월 dd일").format(new Date());
    }
}

#1 voオブジェクト


voはread-only特性を持つオブジェクトです.この特性に基づいてRequestRegisterとRequestLogin voを作成する
  • RequestRegister
  • @Getter
    public class RequestRegister {
        @NotNull(message="Email cannot be null")
        @Size(min=2, message="Email not be less than 2 characters")
        private String email;
    
    
        @NotNull(message="Password cannot be null")
        @Size(min=6, message="Password must be equal or than 6 characters")
        private String password;
    
        @NotNull(message="Nickname cannot be null")
        @Size(min=2, message="Nickname not be less than 2 characters")
        private String nickname;
    
    
        @NotNull(message="Phone cannot be null")
        private String phoneNumber;
    }
  • RequestLogin
  • @Getter
    public class RequestLogin {
        @NotNull(message="Email cannot be null")
        @Size(min=2, message="Email not be less than 2 characters")
        private String email;
    
    
        @NotNull(message="Password cannot be null")
        @Size(min=6, message="Password must be equal or than 6 characters")
        private String password;
    }
  • ResponseUser
  • @Data
    public class ResponseUser {
        private String email;
        private String nickname;
        private String phoneNumber;
        private String userId;
        private String encryptedPwd;
    
        @Builder
        public ResponseUser(
            String email,
            String nickname,
            String phoneNumber,
            String userId,
            String encryptedPwd
        ) {
            this.email = email;
            this.nickname = nickname;
            this.phoneNumber = phoneNumber;
            this.userId = userId;
            this.encryptedPwd = encryptedPwd;
        }
    }
    ResponseUserオブジェクトは、コントローラの戻り値本体に配置するオブジェクトです.当初、voオブジェクトはread-onlyのみのため@Getter宣言を使用していたが、ResponseUserは値を作成する必要があるため、@Data宣言を使用してSetterを使用する.
    以降の登録およびログイン要求では、これらのvoに値を入力して要求し、ResponseUserを使用して値を返します.

    #2 dtoオブジェクト


    dtoオブジェクトは、コントローラ->サービス->Repositoryにデータを移動するときに使用されるオブジェクトです.voには読み取り専用のプロパティがあるため、データの値は変更できません.ただし、dtoオブジェクトを使用してレイヤ間でビジネスロジックまたはデータの変更を行う場合は、このdtoオブジェクトのデータを変更し、最終的にdto値を使用してエンティティに値を挿入することで、リポジトリにデータを格納できます.
  • UserDto
  • @Data
    public class UserDto {
        private String email;
        private String password;
        private String nickname;
        private String phoneNumber;
        private String userId;
        private Date createdAt;
        private String encryptedPwd;
    
        @Builder
        public UserDto(
            String email,
            String password,
            String nickname,
            String phoneNumber,
            String userId,
            Date createdAt,
            String encryptedPwd
        ) {
            this.email = email;
            this.password = password;
            this.nickname = nickname;
            this.phoneNumber = phoneNumber;
            this.userId = userId;
            this.createdAt = createdAt;
            this.encryptedPwd = encryptedPwd;
        }
    }
    ジェネレータを使用して、ユーザーDtoオブジェクトが階層間でデータを変更したことを宣言する場合は、ジェネレータモードを使用してデータを変更します.

    #3 Service


    AutheServiceImplでは、サービスパッケージインタフェースAutheServiceを実装します.ここで,インタフェースの作成とimplクラスの単独作成は,多様性が最も大きいためである.現在は、AutheServiceImplのメソッドを1:1からインタフェースの1:1に移行するだけで、複雑または多様な実装はありませんが、その後、大規模なプロジェクトに移行します.1つの方法で複数の遷移を行うと効果が得られるため,インタフェースとimplクラスを単独で作成する習慣で実現する.
  • AuthService
  • public interface AuthService {
        UserDto registerUser(UserDto userDto);
    }
    
  • AuthServiceImpl
  • @Service
    public class AuthServiceImpl implements AuthService {
    	private AuthRepository authRepository;
    
        @Autowired
        public AuthServiceImpl(AuthRepository authRepository) {
            this.authRepository = authRepository;
        }
        
    	@Transactional
        @Override
        public UserDto registerUser(UserDto userDto) {
            UserEntity userEntity = UserEntity.builder()
                                              .email(userDto.getEmail())
                                              .nickname(userDto.getNickname())
                                              .phoneNumber(userDto.getPhoneNumber())
                                              .encryptedPwd("encrypted_password")
                                              .userId(UUID.randomUUID().toString())
                                              .createdAt(DateUtil.dateNow())
                                              .build();
    
            authRepository.save(userEntity);
    
            return userDto.builder()
                          .email(userEntity.getEmail())
                          .nickname(userEntity.getNickname())
                          .phoneNumber(userEntity.getPhoneNumber())
                          .encryptedPwd(userEntity.getEncryptedPwd())
                          .userId(userEntity.getUserId())
                          .build();
        }
    }
    サービス層は、コントローラからRequestRegisterオブジェクトを受信し、そのビジネスロジックを処理します.

    #4 entity


    entityはjpaを使用して実際のデータベースにマッピングされるクラスです.
    
    @Data
    @Entity
    @Table(name="users")
    public class UserEntity {
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private Long id;
    
        @Column(nullable = false, length=50)
        private String email;
    
        @Column(nullable = false, length = 50)
        private String nickname;
    
        @Column(nullable = false)
        private String phoneNumber;
    
        @Column(nullable = false, unique = true)
        private String userId;
    
        @Column(nullable = false)
        private String createdAt;
    
        @Column(nullable = false, unique = true)
        private String encryptedPwd;
    
        @Builder
        public UserEntity(
            String email,
            String nickname,
            String phoneNumber,
            String userId,
            String createdAt,
            String encryptedPwd
        ) {
            this.email = email;
            this.nickname = nickname;
            this.phoneNumber = phoneNumber;
            this.userId = userId;
            this.createdAt = createdAt;
            this.encryptedPwd = encryptedPwd;
        }
    }
    
    
    パスワードが欠けているのは、暗号化パスワードに関連する暗号化パスワードエンコーダが暗号化パスワードの役割を果たすからである.

    #5 repository


    Repositoryはインタフェースによって実現され、JpaRepository findByを継承することによって....get..., デフォルトのメソッド(saveなど)を使用できます.
    @Repository
    public interface AuthRepository extends JpaRepository<UserEntity, Long> {
    }
    

    #6 controller


    次のコードを使用してコントローラを変更します.
    @PostMapping("/register")
        public ResponseEntity<?> register(@RequestBody RequestRegister user) {
            UserDto userDto = authService.registerUser(UserDto.builder()
                                                              .email(user.getEmail())
                                                              .password(user.getPassword())
                                                              .nickname(user.getNickname())
                                                              .phoneNumber(user.getPhoneNumber())
                                                              .build());
    
            return ResponseEntity.status(HttpStatus.CREATED)
                                 .body(ResponseUser.builder()
                                                   .email(userDto.getEmail())
                                                   .nickname(userDto.getNickname())
                                                   .phoneNumber(userDto.getPhoneNumber())
                                                   .userId(userDto.getUserId())
                                                   .encryptedPwd(userDto.getEncryptedPwd())
                                                   .build());
        }

    #7登録結果確認




    画面に示すように、結果が表示されます.レジスターの流れを見てみましょう.
    1)アイデンティティコントローラは、要求レジストラというvoオブジェクトを要求する.
    Controllerは、UserdtoのauthServiceを返します.RegisterUser(Userdto)Userdtoオブジェクトを作成し、このUserdtoオブジェクトを戻り値としてResponseUserおよび201 Createdに戻します.
    2)アイデンティティサービスの登録ユーザは、渡されたユーザDtoを使用してユーザエンティティオブジェクトを作成し、そのオブジェクトを「ユーザエンティティ」(UserEntity)に渡してデータベースに保存する.
    その後、コントローラはUserDtoが値を返す方法を呼び出すので、UserDtoはコンストラクタモードを使用してUserEntityの値を返します.

    次にSpring Securityを使用して、ログイン、認証、認証に関する記事を作成します。