JPA 테이블 생성하기
- Blog 테이블 만들기 (user, board, reply 테이블)
- User 테이블 : 유저
- Board 테이블 : 게시글
- Reply 테이블 : 답변(댓글)
- 연관관계 만들기
- 더미 데이터 insert
본격적으로 DB의 테이블을 만들기 위해 스프링부트 패키지 이하에 model 패키지를 만들고
안에 User, Board, Reply 클래스를 만든다.
model 패키지란? 테이블을 만들고 관리하기 위한 패키지이다.
모델 패키지의 테이블에는 User, Board, Reply가 있으며 모든 테이블엔 PRIMARY KEY가 있어야 한다.
테이블화 하기 위해서 Entity 어노테이션을 붙인다.
PRIMARY KEY를 만들기 위해서 Id 어노테이션을 붙인다, PRIMARY KEY는 오라클의 시퀀스 혹은 mysql의 auto_increment를 사용함
null값을 위해 Column 어노테이션을 사용한다.
1. User 테이블
회원 정보를 받는 테이블이며
id, username, password, email, role, createDate를 받는다
@Entity //User 클래스가 MySQL에 자동으로 테이블이 생성된다.
public class User {
@Id //PRIMARY KEY
@GeneratedValue(strategy = GenerationType.IDENTITY)
//프로젝트에서 연결된 DB의 넘버링 전략을 따라감
//오라클이면 시퀀스, mysql이면 auto_increment 등
private int id; //시퀀스, auto_increment
@Column(nullable=false, length=30) //null이 될수 없으며 길이제한 30
private String username; //아이디
@Column(nullable=false, length=100) //null이 될수 없으며 길이제한 100
private String password;
@Column(nullable=false, length=50) //null이 될수 없으며 길이제한 50
private String email;
@ColumnDefault("'user'") //홑따옴표는 문자라는 것을 알려줌
private String role; //Enum을 쓰는게 좋다 //admin, user, manager
@CreationTimestamp //시간이 자동입력됨
private Timestamp createDate;
}
💡enum
enum은 어떤 범위를 정할 수 있게 한다. 어떤 범위가 정해졌다 = 도메인이 정해졌다
enum으로 admin, user, manager을 만들면 [admin, user, manager] 셋 중 하나만 들어갈 수 있게 하는 범위 설정이 가능함
초등학생이라면 1~6이 도메인, 고등학생이라면 1~3이 도메인
테이블이 생성되는지 확인하기 위해서는 먼저 ddl_auto가 create인지 확인한다
jpa:
open-in-view: true
hibernate:
ddl-auto: create //확인하기
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
use-new-id-generator-mappings: false //jpa의 기본 넘버링 전략을 따르지 않음
show-sql: true //콘솔창에 표기
properties:
hibernate.format_sql: true //정리해서 보여줌
ddl-auto
- create - 서버 시작시마다 DB초기화
- update - 수정사항만 DB에 반영
- none - DB에 아무런 반영을 하지 않음.
그 다음엔 MySQL이 실행중인지 작업관리자에서 확인하고
실행하면 테이블이 만들어진 것을 확인할 수 있다
1) 콘솔창
2) MySQL Workbench
2. Board 테이블
게시글 테이블이며 id, title, content, count, createDate를 받고
User 테이블과 ManyToOne 연관관계가 있다.
데이터베이스의 경우 오브젝트를 저장할 수 없어 FK(외래키)를 사용하는데 자바는 오브젝트를 저장할 수 있다.
연관관계를 나타낼때는 다음과 같다
- ManyToOne
- OneToMany
- OneToOne
JoinColumn으로 조인된 FK 컬럼의 이름을 정할 수 있다
@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; //조회수
@ManyToOne //연관관계, Many = Board, One = User, 한명의 유저는 여러개의 게시글을 쓸 수 있다.
@JoinColumn(name="userId") //필드 이름
private User user;
//private int userId;
//DB는 오브젝트를 저장할 수 없어 FK를 사용하는데, 자바는 오브젝트를 저장할 수 있다.
//자바는 DB 자료형에 맞춰서 테이블을 만든다
@CreationTimestamp //현재시간으로 자동으로 표기
private Timestamp createDate;
}
적용된 ManyToOne 관계
JoinColumn으로 정한 userId로 테이블이 만들어져있다.
3. Reply 테이블
답변(댓글) 테이블이다.
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class Reply {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) //프로젝트에서 연결된 DB 넘버링 전략을 따라감
private int id;
@Column(nullable=false, length=200)
private String content;
//FK
@JoinColumn(name="boardId") //컬럼 이름이 boardId
@ManyToOne//연관관계, 하나의 게시글에는 여러개의 답변이 달린다
private Board board;
//FK
@JoinColumn(name="userId")
@ManyToOne //하나의 유저는 여러개의 답변을 가질 수 있다
private User user;
@CreationTimestamp
private Timestamp createDate;
}
적용된 외래키의 모습
연관관계에 대해서
연관관계의 주인이란? FK(foreign key)를 누가 가졌냐이다.
메인페이지에는 게시글과 이전, 다음 버튼이 있고
상세보기 페이지에는 작성자, 제목, 내용, 댓글 등이 있다.
상세보기 페이지에는 username이 있고 user라는 테이블을 들고 있다(자바에서는 user 오브젝트)
제목, 내용은 board라는 테이블을 들고 있다(자바에서는 board 오브젝트)
댓글은 reply가 들고 있다.
원래는 이 세가지를 JOIN 하고 SELECT해서 해당 페이지에 데이터를 다 들고 왔겠지만 ORM 방식을 쓰게 되면
board 테이블만 select하면 된다. select * from board where id=1; 하면 JPA가 자바 프로그램과 데이터베이스 사이에서 중계를 해주고 자바가 날린 쿼리문이 아닌 JOIN문을 데이터베이스에게 날린다(user와 board를 조인)
따라서 board 테이블을 요청했지만 user정보도 같이 주게 된다.
하나의 게시글(board)에는 한 명의 작성자(user)가 있고 게시글에 대한 답변(reply)은 여러개일 수 있다.
JOIN을 하면 user는 하나여도 되지만 reply는 하나 이상이다. 따라서 List가 들어가야 한다.
@OneToMany(mappedBy = "board")
//@JoinColumn(name="replyId") (X)
//실제 mysql 테이블엔 replyId FK이 필요없다
//Board 테이블에 Join할때 값만 넣는 용도
//mappedBy = 연관관게의 주인이 아니다.(FK가 아님) DB에 컬럼을 만들지 마세요
private List<Reply> reply;
본 강의는 '메타코딩'님의 동영상 강의를 참고하였습니다.
출처 : https://www.youtube.com/playlist?list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm
'JAVA > Spring' 카테고리의 다른 글
영속성 컨텍스트, json 통신 (0) | 2022.02.18 |
---|---|
Json, RestController, 페이징 (0) | 2022.02.17 |
yml 파일 설정, jsp 파일 (0) | 2022.02.17 |
Maven과 라이브러리/Builder 패턴/yaml 설정 (0) | 2022.02.17 |
포스트맨 실습 : 데이터 요청하기 (0) | 2022.02.17 |