그라가승훈
[유튜브-메타코딩] - 나만의 블로그 만들기 - 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 | 
 
								