그라가승훈
[유튜브-메타코딩] - 나만의 블로그 만들기 - 6. Blog 테이블 만들기 (User, Board, Reply) 본문
- Model 패키지
- User 모델 코드
- Lombok을 사용하여 Getter, Setter, 생성자, Builder 어노테이션 추가
- 권한을 위해 Enum을 사용하여 RoleType 사용
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder // 빌더 패턴
@Entity // User 클래스로 MySQL에 테이블 생성 된다. ORM
// @DynamicInsert // insert시에 null인 필드를 제외시켜준다.
public class User {
@Id //Primary key
@GeneratedValue(strategy = GenerationType.IDENTITY) //프로젝트에서 연결된 DB의 넘버링 전략을 따라간다.
private int id; // 시퀀스, auto_increament
@Column(nullable = false, length = 100, unique = true)
private String username; //아이디
@Column(nullable = false, length = 100) // 해쉬로 비밀번호 암호화 예정
private String password;
@Column(nullable = false, length = 50)
private String email;
// @ColumnDefault("user")
// DB는 RoleType이라는게 없다.
@Enumerated(EnumType.STRING)
private RoleType role; // Enum을 쓰는게 좋다. // ADMIN, USER 등 도메인을 정해줄 수 있다.
private String oauth; // kakao, google
@CreationTimestamp // 시간이 자동 입력
private Timestamp createDate;
}
- Board모델 코드
- @Lob은 대용량 데이터
- 연관관계
- 하나의 User는 여러개의 Board를 가질 수 있다. - ManyToOne (FetchType의 기본 값이 EAGER이다.)
- 하나의 Board는 여러개의 Reply를 가질 수 있다. - OneToMany (FetchType의 기본 값이 LAZY이다.)
- Board 모델을 Select할 때 Reply 모델이 Select되어지고 Reply 모델에 있는 board가 호출되면 다시 Board 모델이 Select 되어 무한참조가 발생한다. JsonIgnoreProperties를 사용하여 JSON데이터로 불려질때는 Board모델에서 Reply 모델을 파싱할때 Reply에 board는 호출되지 않는다.
@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> 태그가 섞여서 디자인 되어서 글자 용량이 큼
@Column
private int count; // 조회수
@ManyToOne // 연관관계 Many = Board, One = User
@JoinColumn(name = "userId")
private User user; // DB는 오브젝트를 저장할 수 없다. FK, 자바는 오브젝트를 저장할 수 있다.
@OneToMany(mappedBy = "board", fetch = FetchType.EAGER, cascade = CascadeType.REMOVE) //테이블에 생성하는 FK키가 아닌 Select할때 Join을 위해 mappedBy로 Reply의 board 사용.
@JsonIgnoreProperties({"board"}) // 무한참조 방지 - (Board에서 Reply를 파싱할 때 Reply 안에있는 "board"는 다시 참조하지 않는다.)
@OrderBy("id desc")
private List<Reply> reply;
@CreationTimestamp // 데이터가 insert 혹은 update 될때 시간이 들어감.
private Timestamp createDate;
}
- Reply모델 코드
- 연관관계
- 하나의 Board는 여러개의 Reply를 가질 수 있다. - ManyToOne
- 하나의 User는 여러개의 Reply를 가질 수 있다. - ManyToOne
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class Reply {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) //auto_increment
private int id;
@Column(nullable = false, length = 200)
private String content;
@ManyToOne // Many = Reply, One = Board
@JoinColumn(name = "boardId")
private Board board;
@ManyToOne // Many = Reply, One = User
@JoinColumn(name = "userId")
private User user;
@CreationTimestamp
private Timestamp createDate;
}
- RoleType 클래스 코드
- Role의 도메인을 만든다.
public enum RoleType {
USER, ADMIN
}
- FetchType의 Eager, Lazy 전략
- ManyToOne 일때는 데이터 하나만 가져오는 것이므로 기본 전략이 EAGER
- EAGER은 데이터를 무조건 가져오는 것이다.
- OneToMany 일때는 많은 데이터를 가져오는 것이므로 기본 전략이 LAZY
- LAZY는 데이터가 클 수 있으니 필요할때만 데이터를 가져오겠다는 것이다.
- Board 테이블 Select 때마다 Reply를 무조건 가져올 것이므로 EAGER 전략으로 변경.
'Spring' 카테고리의 다른 글
[유튜브-메타코딩] - 나만의 블로그 만들기 - 8. Json 데이터로 통신하기 (0) | 2022.08.12 |
---|---|
[유튜브-메타코딩] - 나만의 블로그 만들기 - 7. 더미 데이터로 테스트 (0) | 2022.08.11 |
[유튜브-메타코딩] - 나만의 블로그 만들기 - 5. Yaml(야믈), yml 설정 (JSP 파일 연동) (0) | 2022.08.09 |
[유튜브-메타코딩] - 나만의 블로그 만들기 - 4. HTTP1.1 요청방식 (0) | 2022.08.08 |
[유튜브-메타코딩] - 나만의 블로그 만들기 - 3. Git 세팅 (0) | 2022.08.08 |
Comments