추상화

회원 객체

user 엔티티

  • 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