Model 객체는 컨트롤러에서 데이터를 생성해 이를 View에 전달하는 역할을 합니다. Spring에서 Controller의 메서드를 작성할 때는 특별하게 Model이라는 타입을 파라미터로 지정 가능하다.
package com.example.goormblog.model;
import lombok.*;
import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
import java.sql.Timestamp;
// Entity 어노테이션은 자동으로 mysql에 테이블 생성
@Data
@AllArgsConstructor
@NoArgsConstructor(access= AccessLevel.PROTECTED)
@Table(name="user")
@Entity
public class User {
@Id // primary key라는 것을 알려주는 annotation
@GeneratedValue(strategy= GenerationType.IDENTITY) // 프로젝트에 연결된 DB의 numbering 전략을 따른다.
private int id; // 시퀀스, auto_increment
@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;
@CreationTimestamp // 시간이 자동 입력
private Timestamp createDate;
}
import lombok.*;
import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
import java.sql.Timestamp;
@Data
@AllArgsConstructor
@NoArgsConstructor(access= AccessLevel.PROTECTED)
@Table(name="reply")
@Entity
public class Reply {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(nullable = false, length=200)
private String content;
@ManyToOne
@JoinColumn(name="boardId")
private Board board;
@ManyToOne
@JoinColumn(name="userId")
private User user;
@CreationTimestamp
private Timestamp createDate;
}
조인 컬럼은 외래 키를 매핑할 때 사용한다.
Board에 join된 user는 1개이지만 reply는 1개 이상일 수 있다.
import lombok.*;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
import java.sql.Timestamp;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor(access= AccessLevel.PROTECTED)
@Table(name="board")
@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; // 조회수
// fetch = FetchType.EAGER: Board를 select하면 User 정보는 바로 갖고온다.
@ManyToOne(fetch = FetchType.EAGER) // Many = Board, User = One
@JoinColumn(name="userId")
private User user; // DB는 오브젝트 저장 불가. FK, 자바는 오브젝트 저장 가능
@CreationTimestamp
private Timestamp createDate;
// mappedBy 연관관계의 주인이 아니다. FK가 아니기 때문에 DB에 컬럼을 만들면 안된다.
// reply 테이블의 board가 FK이다.
@OneToMany(mappedBy = "board", fetch = FetchType.EAGER, cascade = CascadeType.REMOVE) // 1개의 게시글에 여러개의 답변이 존재 가능
private List<Reply> reply;
}
@ManyToOne(fetch = FetchType.EAGER) // Many = Board, User = One
@JoinColumn(name="userId")
private User user; // DB는 오브젝트 저장 불가. FK, 자바는 오브젝트 저장 가능
MySQL DB와 연결하는 코드
model 폴더랑 같은 level에 존재하는 config 폴더 아래 DetabaseConfig.java 파일 생성
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class DetabaseConfig {
@Bean
public DataSource dataSource() {
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.driverClassName("com.mysql.cj.jdbc.Driver");
dataSourceBuilder.username("root");
dataSourceBuilder.password("비번");
dataSourceBuilder.url("jdbc:mysql://localhost:3306/DB_이름");
return dataSourceBuilder.build();
}
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.projectlombok:lombok:1.18.22'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
implementation 'mysql:mysql-connector-java'
// https://ktko.tistory.com/entry/Spring-boot-JPA-Open-JDK-%EC%82%AC%EC%9A%A9%EC%8B%9C-Error-creating-bean-with-name-entityManagerFactory-%ED%95%B4%EA%B2%B0
implementation group: 'org.javassist', name: 'javassist', version: '3.15.0-GA'
// https://velog.io/@alswl689/MySQL-JPA-SpringBoot-%EC%97%B0%EB%8F%99-%EB%B0%8F-%ED%85%8C%EC%8A%A4%ED%8A%B8Gradle
developmentOnly 'org.springframework.boot:spring-boot-devtools'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}