@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder //빌더 패턴
@Entity
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) //auto_increment
private int id;
@Column(nullable = false, length = 100)
private String title;
@Lob //대용량 데이터
private String content; //섬머노트 라이브러리 <html>태그가 섞여서 디자인이 됨.
@ColumnDefault("0")
private int count; //조회수
@ManyToOne(fetch = FetchType.EAGER) //연관관계 Many=Board, User=One
@JoinColumn(name = "userId") //외래키
private User user; //DB는 오브젝트를 저장할 수 없다. FK, 자바는 오브젝트를 저장할 수 있다.
// mappedBy 뒤에는 필드이름을 적는다.
@OneToMany(mappedBy = "board", fetch = FetchType.EAGER) //mappedBy는 연관관계의 주인이 아니다. (FK가 아니므로 컬럼을 만들지 않는다)
public List<Reply> reply;
@CreationTimestamp //데이터가 들어갈 때 자동으로 현재시간이 import 된다
private Timestamp createDate;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder //빌더 패턴
@Entity //User 클래스가 자동으로 MySQL에 테이블이 생성이 된다.
public class User {
@Id //Primary key
@GeneratedValue(strategy = GenerationType.IDENTITY) // 프로젝트에서 연결된 DB의 넘버링 전략을 따라간다
private int id; //시퀀스, auto_increment
@Column(nullable = false, length = 30)
private String username;
@Column(nullable = false, length = 100) // 123456 =>해쉬(비밀번호 암호화)
private String password;
@Column(nullable = false, length = 50)
private String email;
@ColumnDefault("'user'")
private String role; //Enum을 쓰는게 좋다. enum은 도메인(범위)을 만들 때 좋다 // admin, user, manager
@CreationTimestamp // 시간이 자동 입력
private Timestamp createDate;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder //빌더 패턴
@Entity
public class Reply {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(nullable = false, length = 200)
private String content;
@ManyToOne //여러개의 답변은 하나의 게시글에 있을 수 있다.
@JoinColumn(name = "boardId")
private Board board;
@ManyToOne //여러개의 답변을 하나의 유저가 쓸 수 있다.
@JoinColumn(name = "userId")
private User user;
@CreationTimestamp
private Timestamp createDate;
}
@Data
: @Getter
와 @Setter
를 합친 어노테이션.
@Builder
: 생성자에 빌더 어노테이션을 붙이면 객체를 만들 때 값의 순서를 지키지 않아도 된다.
@Lob
:대용량 데이터 컬럼에 붙인다.
ManyToOne
Many = Board, User = One
fetch = FetchType.EAGER
: 보드를 가지고 올 때 user정보는 무조건 가져온다.fetch = FetchType.LAZY
: 무조건 가져오지 않고 필요할 때 가져온다.