기본으로 사용할 layout -> base_layout
base_layout.html의 fragment: main에 html 들어감.
base_layout.html
<th:block layout:fragment="main"></th:block>
<!-- th:blobk -> div랑 비슷, 컨텐트가 삽입될 위치 -->
@EnableJpaAuditing // JPA Auditing 기능 활성화.
@SpringBootApplication
public class Spring3Application {
public static void main(String[] args) {
SpringApplication.run(Spring3Application.class, args);
}
}
웹서버(톰캣) 기능까지 포함되어 있는 구조.
따라서 webapp 폴더가 따로 없음.
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
@Getter
public class BaseTimeEntity {
@CreatedDate // insert 될 때의 시간이 자동으로 기록됨.
private LocalDateTime createdTime;
@LastModifiedDate // update 될 때의 시간이 자동으로 기록됨.
private LocalDateTime modifiedTime;
}
@EntityListeners(AuditingEntityListener.class): main method를 가지는 메인 클래스에서 JPA Auditing 기능이 활성화 되어 있는 경우에 Entity가 삽입/수정되는 시간이 자동으로 기록되도록 하기 위해서.
@MappedSuperclass: 다른 도메인(Entity) 클래스의 상위 클래스로 사용됨. 이 클래스를 상속하는 하위 클래스는 BaseTimeEntity가 정의하는 컬럼들을 갖게 됨.
표기법 - camel 표기법, 이름 - db와 같아야 함
Entity class의 field 이름은 db 테이블의 컬럼 이름과 같거나, 컬럼 이름을 camel 표기법으로 변환한 이름으로 작성.
(ex) 테이블 컬럼 created_time -> 클래스 필드 createdTime
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
@ToString
<!-- (아래) 필수 에너테이션 -->
@Entity
@Table(name = "POSTS")
@SequenceGenerator(name = "POSTS_SEQ_GEN", sequenceName = "POSTS_SEQ", allocationSize = 1)
public class Post extends BaseTimeEntity {
@Id // Primary Key 제약조건
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "POSTS_SEQ_GEN")
private long id;
@Column(nullable = false) // Not Null 제약조건
private String title;
@Column(nullable = false)
private String content;
@Column(nullable = false)
private String author;
}
@Entity: JPA Entity class - 데이터베이스 테이블과 매핑되는 클래스. id 컬럼이 반드시 있어야 함.
@Table(name = "POSTS"): Entity class 이름이 데이터베이스 테이블 이름과 다를 경우, 테이블 이름을 명시