@Getter
@NoArgsConstructor
@Entity
public class User extends BaseTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String email;
@Column
private String picture;
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private Role role;
@Builder
public User(String name, String email, String picture, Role role) {
this.name = name;
this.email = email;
this.picture = picture;
this.role = role;
}
public User update(String name, String picture) {
this.name = name;
this.picture = picture;
return this;
}
public String getRoleKey() {
return this.role.getKey();
}
}
- @NoArgsConstructor
파라미터가 없는 기본 생성자를 생성
- @GeneratedValue(strategy = GenerationType.IDENTITY)
데이터베이스에 위임(MySQL) (=Auto_increment)
- @Enumerated(EnumType.STRING)
JPA로 데이터베이스에 저장할 때 Enum 값을 어떤 형태로 저장할지를 결정 (기본 int형)
@Getter
@RequiredArgsConstructor
public enum Role {
GUEST("ROLE_GUEST","손님"),
USER("ROLE_USER","일반 사용자");
private final String key;
private final String title;
}
- @RequiredArgsConstructor
초기화되지 않은 Final 필드나, @NonNull이 붙은 필드에 대해 생성자를 생성,
주로 의존성 주입 편의성을 위해서 사용되곤 한다.
- ROLE_XXX
스프링 시큐리티에서는 권한 코드에 항상 'ROLE_'이 앞에 있어야 한다.
- Enum : 서로 연관된 상수들의 집합을 의미
기존에 상수를 정의하는 방법이었던 'final static String'과 같이 문자열이나 숫자들을 나타내는 기본자료형의 값을 enum을 이용하여 같은 효과를 낼 수 있다.
public interface UserRepository extends JpaRepository<User,Long> {
Optional<User> findByEmail(String email);
}
- findByEmail
email을 통해 기존 가입자인지 아닌지 판단하기 위함.
- Generic 형
자료형이 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미한다. 예를 들어 String타입도 지원하고싶고 Integer타입도 지원하고 싶은 경우 사용한다.
- Optional< T >
"T"타입의 객체를 포장해주는 래퍼 클래스(Wrapper Class)이다.
모든 타입의 참조변수를 저장할 수 있으며, 복잡한 조건문 없이도 Null로 인해 발생하는 예외를 처리할 수 있다.