저번 글에서는 ERDCloud를 활용해서 도메인을 설계했다.
이것을 바탕으로 프로젝트에서 엔티티를 생성하여 DB에 Table을 생성했다.
우선 게시판, 사용자, 댓글 엔티티를 생성했는데 대표로 사용자 엔티티인 Users를 기준으로 어떻게 만들었는지 보려고 한다.
@Entity
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Users extends BaseEntity implements Serializable {
@Serial
private static final long serialVersionUID = -7736430912768305885L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(columnDefinition = "bigint COMMENT '사용자 아이디'")
private Long userId;
@Column(unique = true, columnDefinition = "varchar(255) COMMENT '이메일'")
private String userEmail;
@Column(columnDefinition = "varchar(255) COMMENT '패스워드'")
private String loginPw;
@Column(columnDefinition = "varchar(50) COMMENT '이름'")
private String userName;
@Column(columnDefinition = "varchar(50) COMMENT '휴대폰 번호'")
private String userPhoneNumber;
@Column(unique = true, columnDefinition = "varchar(20) COMMENT '닉네임'")
private String nickName;
@Column(columnDefinition = "varchar(10) COMMENT '생년월일'")
private String birth;
@Column(columnDefinition = "varchar(10) COMMENT '성별'")
@Enumerated(EnumType.STRING)
private Gender gender;
}
앞에 프로젝트 세팅 부분에서도 말했듯이 Lombok을 사용한다.
- @Getter
자동으로 getXxx() 메소드를 생성해준다.
클래스 레벨에 선언해줄 경우, 모든 필드에 접근자가 자동으로 생성된다.
- @Builder
Builder Pattern으로 객체를 생성할 수 있게 해주는 어노테이션이다.
setter가 없어 객체의 불변성을 보장한다.
- @NoArgsConstructor
파라미터가 없는 기본 생성자를 생성해준다.
- @AllArgsConstructor
모든 필드 값을 파라미터로 받는 생성자를 만들어준다.
필드들을 정의할 때 나는 BaseEntity도 생성해주었다.
@Setter
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {
@CreatedBy
@Column(updatable = false)
protected Long createdBy;
@CreatedDate
@Column(updatable = false)
protected LocalDateTime createdDate;
@LastModifiedBy
@Column
protected Long modifiedBy;
@LastModifiedDate
@Column
protected LocalDateTime modifiedDate;
}
데이터가 생성된 날짜, 수정된 날짜, 생성자, 수정자 필드를 넣고 싶은 엔티티가 여러 개라 따로 분리해서 생성하였다.
BaseEntity를 사용하는 방법은 따로 정리해서 추후에 업로드 할 생각이다.
또, 나는 implements Serializable를 해주었는데 사실 실무하면서 이렇게 적용해라~ 하셔서 한 것이지 어떨 때 쓰는 건지 잘 몰랐었다..
그래서 본능적으로 적용하고 이유를 찾아보았다.
자바에서 직렬화란 객체 데이터를 바이트(Byte) 형태로 변환하는 것이다.
객체에 쌓여있는 데이터들이 바이트 단위로 정렬되는 형태이다.
직렬화 대상은 필드 (멤버변수) 들이다.
직렬화 사용 이유는 데이터를 외부 서버로 전송하기 위해서이다.
자체 메모리 위에서만 데이터를 운용하면 굳이 하지 않아도 되지만 DB에 저장하거나 파일로 저장한 객체를 전송하는 상황에서는 스트림을 통해 데이터를 보내는 때 이 때 바이트 단위로 보내야 한다.
IntelliJ에서는 이를 적용하고 SerialVersionUID를 자동 생성할 수 있다.
설정창에서 serializable을 검색해서 밑으로 내리다보면 JVM languages가 있는데 JVM languages | Serializable class without 'serialVersionUID' 이걸 체크하면 된다.
그리고 필드들을 하나씩 정의해 주었다.
나는 userId를 1부터 자동으로 증가하는 primary key로 사용할거라 Id 어노테이션을 붙여주고 기본키 생성을 데이터베이스에 위임한다는 GeneratedValue(strategy = GenerationType.IDENTITY)를 선언했다.
그리고 @Column 어노테이션을 활용하여 데이터타입, 크기, 유니크 속성을 지정해주었다.
나는 성별을 Enum 타입으로 생성하였는데 @Enumerated(value = EnumType.STRING)을 붙여주면 DB에 Enum의 값 자체가 텍스트 그대로 저장이 된다.
EnumType.ORDINAL로 설정하면 해당 Enum 값의 index가 DB에 들어가게 된다.
내용을 정리하다보니 Enum 생성 방법도 포스팅 해야겠다는 생각이 든다..!
우선 여기까지 코드를 짜고 실행하면!
테이블이 잘 생성된 것을 볼 수 있다.
이제 엔티티를 생성했으니 추가적으로 세팅할게 있으면 하고 기능 개발 시작해야겠다. 망망~!
'개발' 카테고리의 다른 글
Enum 생성 (1) | 2023.08.23 |
---|---|
BaseEntity 생성하기 (0) | 2023.08.19 |
도메인 설계 (0) | 2023.08.17 |
파일럿 프로젝트 시작하기 - 프로젝트 세팅 (0) | 2023.08.16 |
mariadb - DB 생성 및 IntelliJ 연동 (0) | 2023.07.20 |