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を作成する
@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;
}
@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;
}
@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値を使用してエンティティに値を挿入することで、リポジトリにデータを格納できます.
@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クラスを単独で作成する習慣で実現する.
public interface AuthService {
UserDto registerUser(UserDto userDto);
}
@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を使用して、ログイン、認証、認証に関する記事を作成します。
Reference
この問題について(Rental Application (React & Spring boot Microservice) - 5 : AUTH-SERVICE(2)), 我々は、より多くの情報をここで見つけました https://velog.io/@biuea/Rental-Application-React-Spring-boot-5-AUTH-SERVICE2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol