관심분야 설정 기능 구현
추상화
회원 객체
Role
- enum 타입 값 객체(value object). 스프링 시큐리티에 필요한 권한을 나타낸다.Interest
- enum 타입 값 객체(value object). 회원의 관심사를 표현한다.
구현
User 엔티티
h2 DB에서는 user
가 예약어이기 때문에 테이블 이름으로 user
를 사용할 수 없다.
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Table(name = "user_info")
public class User {
// 회원 식별 번호
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
@Setter(AccessLevel.NONE)
private Long userId;
@Column(nullable = false, unique = true)
private String email;
@Column(nullable = false)
private String password;
@Column(nullable = false)
private String nickname;
/* 사용자의 관심분야 목록 */
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "user_interest", joinColumns = @JoinColumn(name = "user_id"))
@Column(name = "interest")
@Enumerated(EnumType.STRING)
@Builder.Default
private List<Interest> interests = new ArrayList<>();
/* 회원이 가진 권한 목록 (Spring Security) */
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "user_role")
@Column(name = "role")
@Builder.Default
private List<Role> roles = new ArrayList<>();
}
Role
/**
* 사용자 권한
*/
public enum Role {
ADMIN("ROLE_ADMIN"),
NORMAL("ROLE_USER");
private String value;
private Role(String value) {
this.value = value;
}
@Override
public String toString() {
return this.value;
}
}
Interest
/**
* 사용자의 관심 분야
*/
public enum Interest {
EMPTY(-1),
ENTERTAIN(0),
NATURAL_DISASTER(1),
TRAFFIC_ACCIDENT(2),
POLITICS(3),
ECONOMIC(4),
CRIME(5),
SCIENCE_TECH(6);
private final int value;
private Interest(int value) {
this.value = value;
}
}
Comments