이 문서는 스프링부트 Blog 프로젝트에서 User, Board, Reply 테이블을 생성하는 방법을 설명합니다. 각 클래스의 필드와 어노테이션을 사용하여 테이블을 생성하고, ERD를 통해 관계를 확인할 수 있습니다.
User, Board, Reply 테이블 생성을 위해 각 클래스를 생성하고 필드와 어노테이션을 사용하여 테이블을 생성합니다
JPA - MySQL 연동은 해당 포스팅을 참고해주세요.
UserTable 생성을 위한 User Class 생성
// ORM: Object 를 테이블로 매핑해주는 기술
@Entity // User 클래스를 통하여 MySQL에 테이블 생성
@Data
@NoArgsConstructor // 빈 생성자
@AllArgsConstructor // 모든 생성자
@Builder // 빌더 패턴
public class User {
@Id // Primary Key
@GeneratedValue(strategy = GenerationType.IDENTITY) // 프로젝트에 연결된 DB의 넘버링 전략을 따라간다.
private int id; // 보통 long 타입으로 설정, 오라클: sequence, MySQL: auto_increment
@Column(nullable = false, length = 30, unique = true)
private String username; // 아이디
@Column(nullable = false, length = 100)
private String password; // 패스워드
@Column(nullable = false, length = 50)
private String email; // 이메일
@ColumnDefault("'user'")
private RoleType role; // admin, user, manager 등의 권한을 지정
@CreationTimestamp // 시간 자동으로 입력
private Timestamp createDate; // 가입날짜
}
User 클래스의 경우, username, password, email, role 등 필드를 포함하며, 이메일과 유저명은 각각 unique와 not-null 옵션을 추가하였습니다.
public enum RoleType {
USER, ADMIN
}
클래스 생성 후 서버를 실행 시키면
쿼리문이 실행되는 것을 확인할 수 있습니다.
실제로 데이터베이스에 테이블이 생성되었는지 확인해보면
정상적으로 테이블이 생성된 것을 확인할 수 있습니다.
이제 나머지 클래스도 생성해주고 서버를 실행시켜 테이블을 생성합니다.
Board 테이블 생성
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class Board {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
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) // board (N) : user (1)
@JoinColumn(name = "userId")
private User user; // DB는 오브젝트를 저장할 수 없다. FK를 사용한다. ORM이 자동으로 FK 생성
@OneToMany(mappedBy = "board", fetch = FetchType.EAGER) // mappedBy: 연관관계의 주인이 아니다. (FK가 아니다) DB에 칼럼 생성 X
private List<Reply> reply;
@CreationTimestamp
private Timestamp createDate;
}
Board 클래스에서는 user 필드에 ManyToOne 어노테이션을 사용하여 User와의 관계를 설정하였으며, 대용량 데이터를 포함하므로 Lob 어노테이션을 사용하였습니다.
Reply 테이블 생성
@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;
}
Reply 클래스의 경우 Board와 User 클래스와의 관계를 설정해주었으며, 이를 위해 ManyToOne 어노테이션을 사용하였습니다. 또한, createDate 필드를 CreationTimestamp 어노테이션을 사용하여 자동으로 입력되도록 설정하였습니다.
ERD
application.properties 혹은 application.yml의 spring.jpa.hibernate.ddl-auto 옵션이 create로 설정 되어 있다면 서버가 실행될 때마다 데이터베이스 테이블이 생성됩니다. 따라서 테이블 생성 이후 해당 옵션을 update로 바꾸어 주어 테이블이 재생성 되지 않도록 해줍니다.
spring.jpa.hibernate.ddl-auto=update
'Spring > 블로그 프로젝트' 카테고리의 다른 글
[Blog 프로젝트] 게시글 작성 기능 (API 통신) (0) | 2023.03.18 |
---|---|
[Blog 프로젝트] 로그인 기능 구현 (스프링 시큐리티) (0) | 2023.03.18 |
[Blog 프로젝트] 회원가입 기능 구현 (0) | 2023.03.18 |
[Blog 프로젝트] Spring Boot 프로젝트 생성 (0) | 2023.03.02 |
[Blog 프로젝트] 시작하기 (0) | 2023.03.02 |