[rest api 프로젝트 구축] - spring security (1) - 도메인 만들기

geun kim·2023년 3월 26일
0

REST API 구축

목록 보기
10/20

Account 도메인 추가
OAuth2로 인증을 하려면 일단 Account 부터
● id
● email
● password
● roels


@Entity
@Getter @Setter @EqualsAndHashCode(of = "id")
@Builder @NoArgsConstructor @AllArgsConstructor
public class Account {

    @Id @GeneratedValue
    private Integer id;

    @Column(unique = true)
    private String email;

    private String password;

    @ElementCollection(fetch = FetchType.EAGER)
    @Enumerated(EnumType.STRING)
    private Set<AccountRole> roles;

}

@ElementCollection:
-RDB에는 컬렉션과 같은 형태의 데이터를 컬럼에 저장할 수 없기 때문에, 별도의 테이블을 생성하여 컬렉션을 관리해야한다.
이때 컬렉션 객체임을 JPA에게 알려주는 어노테이션이 @ElementCollection이다.
JPA는 @Entity가 아닌 Basic Type이나 Embeddable Class로 정의된 컬렉션을 테이블로 생성하며 One-To-Many 관계를 다룬다.
-연관된 부모 Entity 하나에만 연관되어 관리된다. (부모 Entity와 독립적으로 사용 X)
-항상 부모와 함께 저장되고 삭제되므로 cascade 옵션은 제공하지 않는다. (cascade = ALL 인 셈)
-부모 Entity Id와 추가 컬럼(basic or embedded 타입)으로 구성된다.
-기본적으로 식별자 개념이 없으므로 컬렉션 값 변경 시, 전체 삭제 후 새로 추가한다.

public enum AccountRole {

    ADMIN, USER
}
@Builder @AllArgsConstructor @NoArgsConstructor
@Getter @Setter @EqualsAndHashCode(of ={ "id" ,"name"})
@Entity
public class Event {

    ...............

    @ManyToOne
    @JsonSerialize(using = AccountSerializer.class)
    private Account manager;


    ...............

}

@JsonSerialize
JSON 수발신할때 값 설정 옵션 제공

@JsonSerialize(using = AccountSerializer.class)
Account를 json serialization 할 때 AccountSerializer 클래스를 사용하라는 뜻

@JsonSerialize(include=JsonSerialize.Inclusion.NON_DEFAULT)
int 0 : 안보냄
"" : 안보냄
null : 안보냄

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
@JsonInclude(JsonInclude.Include.NON_NULL)
int 0 : 보냄
"" : 보냄
null : 안보냄

@JsonSerialize(include=JsonSerialize.Inclusion.ALWAYS)
int 0 : 보냄
"" : 보냄
null : 보냄

@JsonSerialize(include=JsonSerialize.Inclusion.NON_EMPTY)
int 0 : 보냄
"" : 안보냄
null : 안보냄


public class AccountSerializer extends JsonSerializer<Account> {

    @Override
    public void serialize(Account account, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeStartObject();
        gen.writeNumberField("id", account.getId());
        gen.writeEndObject();
    }
}
profile
Devops Load Map

0개의 댓글