Entity 클래스 : 테이블을 매핑 처리하기 위한 Java 객체를 생성하기 위한 클래스 - Entity 클래스의 필드는 테이블의 컬럼과 매핑되도록 작성
@Entity : Java 객체를 테이블로 사용하기 위한 기능을 제공하는 어노테이션 - 테이블의 이름은 클래스 이름으로 자동 설정
@Table : 테이블 관련 정보를 제공하기 위한 어노테이션
@id : 테이블의 컬럼에 Primary Key 제약조건을 부여하기 위한 어노테이션
@GetneratedValue : 자동 증가값을 제공받아 컬럼에 저장하기 위한 어노테이션
@SequenceGenerator : 데이터베이스에 시퀀스를 생성하여 제공하는 어노테이션
@Column : 필드를 컬럼으로 변환하기 위한 어노테이션 - 컬럼 속성을 변경하지 않을 경우 생략 가능
@CreationTimestamp : 테이블에 행이 삽입될 때 생성된 시간을 저장하는 기능을 제공하는 어노테이션
@UpdateTimestamp : 테이블의 행이 변경될 때 자동으로 생성된 시간을 변경하는 기능을 제공하는 어노테이션
insertable 속성 : false로 설정된 경우 테이블의 행 삽입시 컬럼 미사용
@MappedSuperclass : 부모 역할의 Entity 클래스로 설정하기 위한 어노테이션 - 데이터베이스의 테이블과 매핑되지 않도록 설정
@EntityListeners : EntityListener 클래스를 등록하기 위한 어노테이션 - AuditingEntityListener 클래스를 등록하여 생성 시간과 변경 시간을 자동으로 관리되도록 설정

JpaRepository 인터페이스 : CRUD 기능을 제공하는 인터페이스
첫번째 제네릭에는 Entity 클래스로 작성, 두번째 제네릭에는 PK 제약조건이 설정된 필드의 자료형으로 작성해 JpaRepository 인터페이스의 메소드가 필요한 정보를 제공하여 사용되도록 설정
Repository 인터페이스를 작성하면 JPA 내부에서 인터페이스를 상속받은 자식클래스로 객체 생성
JpaRepository.findAll() : 테이블에 저장된 모든 행을 검색하여 List 객체로 반환하는 메소드 - 하나의 행은 Entity 객체로 변환하여 List 객체의 요소값으로 저장
for문 이용하여 boardEntityList를 boardDTOList로 변환




getBoard() 메소드 작성 오버라이드
Optional 객체 : 제네릭으로 설정된 클래스의 객체 대신 NULL이 저장될 경우 안전하게 처리하는 기능을 제공하는 객체 - NullPointerException 발생 방지
Optional.isPresent() : Optional 객체에 객체가 저장되어 있는 경우 [true]를 반환하는 메소드
Optional.empty() : Optional 객체에 NULL이 저장되어 있는 경우 [true]를 반환하는 메소드
Optional.get() : Optional 객체에 저장된 제네릭의 객체를 반환하는 메소드
조회수를 증가하는 메소드 생성하여 getBoar에 추가
@Modfiying : JPQL를 사용해 메소드에 insert, update, delete 명령을 등록하기 위한 어노테이션
@Query : JPQL(Java Persistence Query Language)를 사용해 추상메소드에 SQL 명령을 등록하는 어노테이션
@Param : @Query 어노테이션으로 등록된 SQL 명령에 매개변수에 저장된 값을 제공하기 위한 어노테이션

getBoard 메소드에서 행을 먼저 검색한 뒤 조회수 update를 하기 때문에 detail에서 조회수 표시는 +1을 해서 출력
inline 속성 : css 태그 또는 javascript 태그에서 인라인 표현식을 사용하기 위한 속성





