@Entity // 더이상 자세한 설명은 생략한다.
/*
* 테이블 속성을 정의하기 위한 Annotation
* 상속 전략을 사용하는 테이블의 경우 어떤 상속 전략을
* 사용할지에 따라서 작성을 하면 안되는 경우가 있습니다.
* 상속 전략을 사용하실 것이라면 어떤 상속 전략을 쓸지 판단해야 합니다.
*/
@Table(
/*
* Table 이름을 정의.
* 이 부분을 제거하면 Class 이름으로 테이블이 생성된다.
* 테이블 이름 규칙은 [TB] + _ + [GROUP NAME] + _ + [TABLE NAME] 입니다.
* 하지만 여기서 GROUP NAME 까지 작성하시는건 어려울 것이라 판단됩니다.
* 그래서 [TB] + _ + [TABLE NAME] 와 같은 규칙으로 작성하시길 바랍니다.
*/
name = "TB_BLOG_POST",
/*
* 테이블 INDEXING 정의입니다.
* 지금 혼자 공부할 때 필수가 아니니 제거하셔도 됩니다.
* (지금 공부하지 말란 말입니다. 그냥 이런게 있구나라는 인식만 있으면 됩니다.)
*/
indexes = {@Index(name = "IDX_BLOG_POST_FLAG", columnList = "useFlag, delFlag")}
)
@Getter // 더이상 자세한 설명은 생략한다.
@DynamicInsert // 이건 한 번 검색해서 공부를 해주세요.
@DynamicUpdate // 이건 한 번 검색해서 공부를 해주세요.
/*
* 기본 생성자에 대한 접근 권한을 설정.
* 이건 한 번 검색해서 공부를 해주세요.
*/
@NoArgsConstructor(access = PROTECTED)
public class Board {
@Id // 더이상 자세한 설명은 생략한다.
@GeneratedValue(strategy = GenerationType.IDENTITY)
// 이건 한 번 검색해서 공부를 해주세요.
private Long id;
/*
* Column 에 대한 상세 설정이 가능한 Annotation
* 상당히 다양한 설정을 할 수 있습니다.
* 이건 한 번 검색해서 공부를 해주세요.
*/
@Column(
nullable = false, // null 입력이 가능한지 설정 (DB Column null 제약 조건을 공부하면 됩니다.)
length = 100 // 최대 길이 설정 (DB Column length 를 공부하면 됩니다.)
)
private String title;
@Lob // TEXT 와 같이 큰 문자열 유형을 정의 (DB Column 데이터 유형을 공부하면 됩니다.)
@Column(nullable = false)
private String contents;
/*
* 작성일을 적고 싶으셨던 것 같습니다.
* 작성일은 DB 에 값이 Insert 될 때 설정되겠죠?
* 이 설정 방법도 다양합니다.
* 어떤 설정 방법이 있는지 공부해서 알려주세요.
*/
private LocalDateTime createDate;
}
@Entity - 상속 전략?
객체는 상속을 지원하지만 DB는 상속을 지원하지 않는다, 그래서 논리 모델을 물리 모델로 구현할 방법이 필요하다
JPA가 이 세가지 방식과 매핑하기 위해서는
- @inheritance(strategy = inheritance)종류 :
- JOINED
- SINGEL_TABLE
- TABLE_PER_CLASS
- deault 전략은 single table 전략
- @DiscriminatorColumn(name= “ ”)
- 부모 클래스에 선언. 하위 클래스를 구분하는 용도의 컬럼. 관례: default=DTYPE
- @Discriminator(”XXX”)어노테이션을 선언하지 않을 경우 기본 값으로 클래스 이름이 들어간다.
- 하위 클래스에 선언. 엔티티 저장시 슈퍼타입의 구분 컬럼에 저장할 값을 지정한다.
주로 JOINED, SINGLE_TABLE 전략 사용
https://ict-nroo.tistory.com/128
entity extends, entity inheritance 차이
Entity 칼럼 상속
테이블과 매핑하지 않고 부모 클래스를 상속 받는 자식 클래스에게 매핑 정보(엔티티 칼럼)만 제공하고 싶으면 @MapperSuperClass를 사용하면 된다.
mappersuperclass를 비유하면 추상 클래스와 비슷한데 entity는 실제 테이블과 매핑되지만 mappedsupperclass는 실제 테이블과 매핑 되지 않는다.
주의:
- 상속 관계는 매핑이 아니다.
- MappedSuperclass가 선언 되어있는 클래스는 엔티티가 아니다. 테이블과 매핑 안된다.
- 단순히 부모 클래스를 상속받는 자식 클래스에 매핑 정보만 제공
- 조회 검색 불가능 (부모 불가능)
- 직접 생성해서 작업하지 않음 추상 클래스로 제작 권장 abstract
- 주로 등록일 수정일 등록자 수정자 같은 공통 엔티티를 공통으로 적용하는 정보를 모을때 사용한다.
- 참고 : JPA에서 @Entity 클래스는 @Entity나 @MappedSuperclass로 지정한 클래스만 상속 할 수 있다.
mappedsuperclass - 내가 상위라고 하는 이름표(inheritance가 없어도 사용 가능하다)
inheritance는 상속이라고 드러내는 이름표
- extends
- 부모에서 선언 / 정의를 모두하며 자식은 메소드 / 변수를 그대로 사용할 수 있음
- implements (interface 구현)
- 부모 객체는 선언만 하며 정의(내용)은 자식에서 오버라이딩 (재정의) 해서 사용해야함
- abstract
- extends와 interface 혼합. extends하되 몇 개는 추상 메소드로 구현되어 있음
@DynamicInsert - insert 값이 null 일때 무시하게 해줌
@DynamicUpdate - 위와 같음
@NoargsConstructor(access= protected)
왜 사용 하는가?
무분별한 객체 생성에 대해 한번 더 체크 할 수 있는 수단이 된다.
EX) User 이라는 Class가 name, age, email 정보를 모두 가지고 있어야만 하는 경우에 기본 생성자를 막는 것은 이를 도와주는 좋은 수단이 된다.
만약에 기본 생성자의 권한이 public 일시 이러한 상황이 발생할 수 있다.
https://cobbybb.tistory.com/14
@GeneratedValue(strategy = “?”)
identity - 기본키 생성 DB에 위임 (+ 특별한 경우 IDENTITY 전략에서응 entityManager.persist()하는 시점에서 insertSQL을 실행하여 데이터베이스에서 식별자를 조회하여 영속성 컨텍스트 1ck 캐시에 값을 넣어주기 때문에 관리가 가능해진다.)
sequence - DB의 sequence object를 사용하여 데이터베이스가 자동으로 기본키를 생성 해줌, sequenceGenerator 어노테이션이 필요하다. (+ sequence 값을 계속 DB에서 가져와서 사용해야 하기 때문에 성능 저하를 일으킬 수 있다. but allocationSize의 크기를 적당히 설정하여 성능 저하 개선 가능) - 사용 가능한 디비 제한
table - 키를 생성하는 테이블을 사용함 sequence와 유사 @TableGenerator 어노테이션 필요, 모든 디비 사용 가능
auto - 기본 설정 값으로 각 데이터베이스에 따라 기본키를 자동으로 생성한다. - 우선순위 존재
@Column 어노테이션
속성 | 설명 | 기본값 |
name | Mapping 할 Column의 이름을 지정 | 객체 Field 이름 |
insertable | Entity 저장 시 해당 Feild도 저장, false오 릭기 전용 설정 가능하다. | true |
updateable | Entity 수정 시 해당 Feild도 수정, false로 읽기 전용 설정 가능 | true |
table | 하나의 Entity 설정에서 두개 이상의 Table에 매핑할 때 사용 | 현재 Class가 매핑된 Table |
nullable(DDL) | true/false로 null 허용 여부 설정 | true |
unique(DDL) | true/false로 unique 허용 여부 설정 | |
length(DDL) | Column 속성 길이 설정 | 255 |
columnDefinition | DB Column 정보를 직접 설정 | Java Type과 설정 DB방언으로 , 적절한 Column Type 생성 |
percision, scale(DDL) | BigDecimal, BigInteger Type에서 사용, precision은 소수점 포함 전체 자릿수,scale은 소수 자릿수,double, float Type에는 적용되지 않음.아주 큰 숫자나 정밀한 소수를 다룰때 사용. | precision=19, scale=2 |
https://velog.io/@gillog/JPA-Column-Annotation
@Lob : Large Object 줄임말
어노테이션으로 large object를 데이터베이스에 적절하게 저장한다.
Java.util.Calender
둘의 문제점
localDate 탄생
https://d2.naver.com/helloworld/645609
@NoArgsConstructor(access = PROTECTED)
protected는 무분별한 생성자 제작에 제한을 두게 해준다.
Entity에서 기본적으로 Setter을 설정하지 않는다.
JPA에서는 특히나 어디서나 변경 되는 환경을 막는게 맞다.
그럼 우리는 Setter원래 쓰지 않는다 -> 그럼 @Buillder을 사용하자
'개발 > JPA' 카테고리의 다른 글
Spring Boot + Gradle에서 사용할 querydsl 초기 셋팅 (0) | 2022.11.18 |
---|---|
Serializable를 사용하는것인가? (0) | 2022.11.16 |
JPA + Postgres 사용시 주의할 @Lob (0) | 2022.11.15 |
@Enumerated(EnumType.SRTING) (0) | 2022.07.10 |