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'
}