Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

그라가승훈

[유튜브-메타코딩] - 나만의 블로그 만들기 - 6. Blog 테이블 만들기 (User, Board, Reply) 본문

Spring

[유튜브-메타코딩] - 나만의 블로그 만들기 - 6. Blog 테이블 만들기 (User, Board, Reply)

그라가승훈 2022. 8. 10. 11:41

- 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

}

- FetchTypeEager, Lazy 전략

  • ManyToOne 일때는 데이터 하나만 가져오는 것이므로 기본 전략이 EAGER
  • EAGER은 데이터를 무조건 가져오는 것이다.
  • OneToMany 일때는 많은 데이터를 가져오는 것이므로 기본 전략이 LAZY
  • LAZY는 데이터가 클 수 있으니 필요할때만 데이터를 가져오겠다는 것이다.
  • Board 테이블 Select 때마다 Reply를 무조건 가져올 것이므로 EAGER 전략으로 변경.
Comments