package com.spring.app.model;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
//Spring Data JPA는 "JpaRepository"라는 기능을 사용하면 매우 간단히 데이터를 입력,수정,삭제,검색을 할 수 있게 해준다.
//JpaRepository 인터페이스는 org.springframework.data.jpa.repository 패키지의 "JpaRepository"라는 인터페이스를 상속하여 만든다.
//아래와 같이 만든다.
//public interface 인터페이스이름 extends JpaRepository <엔티티클래스명, ID필트타입>
//클래스의 선언 앞에 "@Repository"라는 어노테이션이 붙여져 있다.
//그러면 이 인터페이스가 JpaRepository임을 나타낸다. 스프링레거시 에서는 반드시 @Repository 어노테이션을 붙여 두어야 한다.
//그런데 스프링부트 에서는 @Repository 를 생략해도 가능하다.
@Repository // select , delete 안만든다 .. mybatis같은 경우와 다르다
public interface BoardRepository extends JpaRepository<Board, Long>{
//JpaRepository<> <> 안에 insert delete 할 것들을 적어줘야 한다 어떤 vo와 연동되어서 select,delete를 해야하는 것인지
//Board 클래스가 entity 어떤 테이블인지 board라는 테이블을 만든다
// 필드 타입은 Long이다
}
엔티티클래스명하고 똑같아야함
package com.spring.app.domain;
import javax.persistence.Entity;
@Entity
public class Board {
}
@Entity를 쓰고 import해야함
@Entity
@Table(name="tbl_board")
public class Board {
}
@table를 해줘야함 --> (name="tbl_board") 이렇게 생성하면 자동적으로 생성이 된다.
package com.spring.app.domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@Entity
@Table(name="tbl_board")
public class Board {
@Id // 이게 primary key
/*엔티티의 기본 키로 매핑된 컬럼은 기본 테이블의 기본 키로 가정됩니다. 만약 <code>Column</code> 애노테이션이 지정되지 않은 경우, 기본 키 컬럼 이름은 기본 키 속성 또는 필드의 이름으로 가정됩니다.*/
@Column(name="num", columnDefinition="NUMBER")
@SequenceGenerator(name="SEQ_BOARD_GENERATOR", sequenceName = "seq_Board", allocationSize = 1) // sequenceName = "seq_Board" 이것이 오라클에서 말하는 시퀀스 네임
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_BOARD_GENERATOR") //여기에 값을 넣어주는 것은 시퀀스이다
private long num; // 게시글 번호
//private String num; -> 이렇게하면 controller에서 JpaRepository<Board, String> 이렇게 만들어줘야 한다
private String fk_userId;
}
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_BOARD_GENERATOR")
```
@GeneratedValue-> 기본 키 값의 자동 생성을 지정한다
GenerationType.seqence -> 데이터베이스 시퀀스를 사용하여 기본키 값을 생성한다는 것을 의미함
generator-> SEQ_BOARD_GENERATOR 사용할 시퀀스 생성기 이름을 나타낸다
@Id 필드에 이 애노테이션을 붙이면 엔티티가 저장될 때마다 지정된 시퀀스를 사용하여 자동으로 기본 키 값이 할당됩니다.
package com.spring.app.domain;
import java.time.LocalDateTime;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@Entity
@Table(name="tbl_board")
public class Board {
@Id // 이게 primary key
/*엔티티의 기본 키로 매핑된 컬럼은 기본 테이블의 기본 키로 가정됩니다. 만약 <code>Column</code> 애노테이션이 지정되지 않은 경우, 기본 키 컬럼 이름은 기본 키 속성 또는 필드의 이름으로 가정됩니다.*/
@Column(name="num", columnDefinition="NUMBER")
@SequenceGenerator(name="SEQ_BOARD_GENERATOR", sequenceName = "seq_Board", allocationSize = 1) // sequenceName = "seq_Board" 이것이 오라클에서 말하는 시퀀스 네임,, alloctationSize--> 시퀀스 증가치이다
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_BOARD_GENERATOR") //여기에 값을 넣어주는 것은 시퀀스이다
private long num; // 게시글 번호
//private String num; -> 이렇게하면 controller에서 JpaRepository<Board, String> 이렇게 만들어줘야 한다
// 초기치를 줄 때는 initialValue = 1 이렇게 주면 된다 초기치를 안주면 1이 된다
@Column(name="fk_userid", nullable = false, length = 50, updatable = false ) //nullable = false => null 값을 허용한다
// length = 50 --> varchar2 의 50 ,, updatable = falsed --> updatable를 안주면 자동적으로 true가 된다 updatable = false 이렇게하면 수정이 불가하다
/* boolean nullable() default true;
/**
* (Optional) Whether the column is included in SQL INSERT
* statements generated by the persistence provider.
*/
private String fk_userId;
@Column(nullable = false, length = 500)
private String subject;
@Column(nullable = false, length = 4000)
private String content;
@Column(name="reg_date", nullable = false, columnDefinition="DATE DEFAULT SYSDATE", updatable = false) //updatable = false => 수정이 불가하다 ..
private LocalDateTime regdate; // JPA는 name="regdate" 이렇게 주는 걸 안좋아한다 반대로 private LocalDateTime reg_date; 이렇게 넣는 것도 안좋다 언더바 금지
// 컬럼명에 _가 있는 경우 findBy~ 등으로 검색이 불가능하므로 비록 DB 컬럼명에는 _ 가 있더라도 아래와 같이 자바 필드명에는 _를 넣지 않도록 설정해야 한다.
// 필드명에 _가 들어가 있는 경우 JpaRepository 상속 받는 인터페이스에서 findBy~ 을 사용하여 검색하는 메소드 작성시 _ 앞은 테이블명 _ 뒤는 컬럼명 으로 인식하기 때문에 이상하게 꼬여지기 때문에 _ 를 넣지 않도록 설정해야 한다.
@Column(name="readcount", nullable = false, columnDefinition="NUMBER DEFAULT 0", insertable = false ) // 조회수는 스스로가 UPDATE 해주면 안되기 때문에 정상적으로 UPDATE가 되어야 한다
// insertable = false 이 필드는 DEFAULT 0 이 있으므로 insert시 제외
private int readcount; // 조회수
// readCount 는 read_count 로 인식되므로 name 속성이 필요--> 그러하여 readcount 이렇게 적어야 한다
// 연관관계 정의
}