전체 방문자
오늘
어제
21종
종이의 코딩 공부방
21종
  • 분류 전체보기 (171)
    • JAVA (64)
    • Springboot (46)
      • 블로그만들기 (45)
    • Database (60)
      • Oracle (60)
    • 프로젝트 3 (CELOVER) (0)
    • 개발서버 구축 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 글

최근 댓글

hELLO · Designed By 정상우.
21종

종이의 코딩 공부방

Springboot/블로그만들기

[Springboot] 블로그 만들기 (7)_Board Table 생성, 연관관계 주인

2023. 11. 22. 16:31

클래스 생성

Board.java

package com.lwj.blog.model;

import java.sql.Timestamp;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.CreationTimestamp;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@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; // 조회수 , 기본값은 0

	@ManyToOne(fetch = FetchType.EAGER) // 연관관계 설정 // Many = Board, User = One -> 한명은 여러개의 게시물을 쓸 수 있다.
	// EAGER -> 항상 데이터를 가져온다. 즉 Board를 select 할 때 항상 USER 테이블 정보까지 함께 조회한다.
	// LAZY -> 필요할때만 가져온다는 뜻.
	@JoinColumn(name="userId") // foreignkey로 만든다. 필드값은 userId로 저장됨
	private User user; // DB는 오브젝트를 저장할 수 없다. FK, 자바는 오브젝트를 저장할 수 있다.
	
	@OneToMany(mappedBy = "board", fetch = FetchType.EAGER)
	// mappedBy 연관관계의 주인이 아니다 (난 FK가 아니에요) DB에 칼럼을 만들지 마세요.
	// "board"는 Reply 테이블의 board 필드명
	// @JoinColumn(name = "replyId") // 이걸 적는다면 FK가 생기는데 단순히 join을 할 뿐이지 FK를 만들 필요는 없다.
	// 게다가 여러개의 댓글이 있을경우 1,2,3,4.. 처럼 콤마로 구분돼어 들어간다. 1NF(1정규화)가 깨진다.
	private List<Reply> reply; // 하나의 글에는 여러개의 댓글이 가능하기 때문에 List 로  가져와야된다.
	
	@CreationTimestamp
	private Timestamp createDate;
}

 

연관관계 주인

=> FK를 누가 가졌는지 

메인페이지

글 제목 - Board

글 번호 - Board

 

상세페이지

작성자 - User

제목 - Board

내용 - Board

댓글 - Reply


ORM JPA 를 사용하기 전

메인페이지 

SELECT * FROM BOARD;

 

상세페이지

SELECT * FROM BOARD

JOIN USER U ON (B.USERID = U.USERID) 

JOIN REPLY R ON (B.BOARDNO = R.BOARDNO);


JPA 를 사용했을 경우 

@ManyToOne(fetch = FetchType.EAGER) // 연관관계 설정 // Many = Board, User = One -> 한명은 여러개의 게시물을 쓸 수 있다.
// EAGER -> 항상 데이터를 가져온다. 즉 Board를 select 할 때 항상 USER 테이블 정보까지 함께 조회한다.
// LAZY -> 필요할때만 가져온다는 뜻.
@JoinColumn(name="userId") // foreignkey로 만든다. 필드값은 userId로 저장됨
private User user; // DB는 오브젝트를 저장할 수 없다. FK, 자바는 오브젝트를 저장할 수 있다.

 

BOARD 객체가 위 코드와 같이 USER 오브젝트를 갖고 있기 때문에 자동으로 JPA가 DB에 BOARD테이블과 USER테이블을 JOIN한 쿼리를 날린다.

 

그러나 REPLY 정보는 없기 때문에 BOARD를 SELECT 를 했을 때 REPLY도 가져오게 하는 코드를 써야된다.

@OneToMany(mappedBy = "board", fetch = FetchType.EAGER)
// mappedBy 연관관계의 주인이 아니다 (난 FK가 아니에요) DB에 칼럼을 만들지 마세요.
// "board"는 Reply 테이블의 board 필드명
// @JoinColumn(name = "replyId") // 이걸 적는다면 FK가 생기는데 단순히 join을 할 뿐이지 FK를 만들 필요는 없다.
// 게다가 여러개의 댓글이 있을경우 1,2,3,4.. 처럼 콤마로 구분돼어 들어간다. 1NF(1정규화)가 깨진다.
private List<Reply> reply; // 하나의 글에는 여러개의 댓글이 가능하기 때문에 List 로  가져와야된다.

 

@joinCoulmn을 쓰게 된다면 Board 테이블이 아래와 같이 생성된다.

 

replyId 에 콤마로 구분돼서 데이터가 들어간다.

1NF(제1정규화) 가 깨진다 -> DB에서는 하나의 컬럼에서는 하나의 원자값을 갖는다.


MySQL에서 확인


제약조건 확인

잘 만들어졌다


참고 유튜브 (메타코딩님 강의)

https://youtu.be/MJSMvETSE7E?si=ewcSm6-D62hGHQ80

https://youtu.be/DtMmXQl4_hw?si=wchrF8mCbMuBHLQ2

    'Springboot/블로그만들기' 카테고리의 다른 글
    • [Springboot] 블로그 만들기 (9)_회원가입 insert 테스트
    • [Springboot] 블로그 만들기 (8)_Reply Table 생성
    • [Springboot] 블로그 만들기 (6)_User Table 생성
    • [Springboot] 블로그 만들기 (5)_Yaml, Yml 설정, JSP 연결
    21종
    21종
    코딩 공부한 것 정리하려고 만든 블로그

    티스토리툴바