
@Entity
@Table(name="notification")
public class Notification extends BaseTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "title")
private String title;
@Column(name = "content")
private String content;
@Column(name = "type")
private String type;
@Column(name = "url")
private String url;
@Column(name = "status")
private String status;
@CreatedDate
@Column(name = "created_at")
private LocalDateTime createdAt;
@LastModifiedDate
@Column(name = "updated_at")
private LocalDateTime lastModifiedAt;
@ManyToOne
@JoinColumn(name = "member_id", referencedColumnName = "member_id")
private Long receiver_id;
@ManyToOne
@JoinColumn(name = "member_id", referencedColumnName = "member_id")
private Long sender_id;
}
1. PK 타입?
PK 설정부터 막히는 거.. 그래서 검색해봤다.
MySQL(bigint) - Java(Long) 으로 해야 대용량 데이터를 처리하는 시스템에 맞다고 한다.
int 말고 bigint를 쓰는 이유 : int는 4byte라서 -21억~21억 범위만 표현 가능한데 bigint는 8byte임
long 말고 Long 쓰는 이유 : id에 primitive 타입을 쓰면 id값이 할당되지 않았을 때 값이 '0'이 됨. 그래서 데이터가 0이 들어간 건지 할당이 안 된건지 데이터만 보고 알 수가 없음
반면 wrapper 타입을 쓰면 id값이 할당되지 않았을 때 null이 들어가기 때문에 아이디가 할당되지 않았구나 바로 알 수 있음
2. FK는 어떻게 처리?
@ManyToOne
@JoinColumn(name = "member_id", referencedColumnName = "member_id")
private Long receiver_id;
@ManyToOne
@JoinColumn(name = "member_id", referencedColumnName = "member_id")
private Long sender_id;
알림 엔티티에서 보내는 사람, 받은 사람을 알고 있어야 하므로 회원 테이블에서 member_id를 참조해서 가져오게 했다.
알림-회원 관계가 N:1이므로 Many to one으로 회원을 참조하고 JoinColumn으로 해당 테이블에서의 컬럼명, 목표 테이블의 pk명을 지정해줬다.
3. 날짜값은 어떻게 저장?
@JpaAuditing으로 생성 시간, 수정 시간 자동화
BaseTimeEntity 클래스를 만들어서 엔티티가 상속하게 했다.
사용 방법 :
- @EnableJpaAuditing
- Spring Data Jpa에서 제공하는 기능 중 하나
- 스프링 애플리케이션 클래스에 추가
- jpa 엔티티의 변경 이력을 추적하기 위해 사용됨
- 생성일, 수정일을 자동으로 기록할 수 있음
@SpringBootApplication
@EnableJpaAuditing
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
- @EntityListners(AuditingEndityListner.class)
- 자동 생성 날짜 칼럼이 필요한 엔티티에 추가
- 해당 엔티티를 저장, 수정하면 자동으로 이벤트가 발생
-> 변화를 감지하여 자동으로 @CreatedDate, @LastModifiedDate가 붙은 필드를 업데이트
- @CreatedDate
- 자동 생성 날짜 칼럼 위에 추가
- @LastModifiedDate
- 마지막으로 수정한 날짜를 저장할 칼럼 위에 추가
- @MappedSuperclass가 적용된 클래스를 상속받으면 자식 클래스로 테이블이 생성됨
이 때 클래스는 LocalDateTime으로 해야 함
//수정 전
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseTimeEntity {
// 데이터가 생성된 날짜
@CreatedDate
@Column(updatable = false)
private LocalDateTime createDate;
// 마지막으로 수정된 날짜
@LastModifiedDate
private LocalDateTime modifyDate;
}
지금 필드명을 createDate, modifyDate로 설정했는데 이렇게 하면 컬럼명이 각각 created_date, modify_date로 매핑된다.
하지만 erd 컬럼을 created_at, updated_at으로 설계했으므로 필드명도 createdAt, updatedAt으로 바꿔야 한다.
//수정 후
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
@CreatedDate
@Column(name = "created_at", updatable = false, nullable = false)
private LocalDateTime createdAt;
@LastModifiedDate
@Column(name = "updated_at", nullable = false)
private LocalDateTime updatedAt;
}
[JPA] Entity PK는 bigint(MySQL)-Long(java) 타입으로 해야 하는 이유
프로젝트 개발 시 향후 대량의 데이터를 고려한다면 JPA를 통해 Entity PK는 bigint 타입이 좋다.중규모의 프로젝트면 int 타입이 적절하지만, 거의 대부분이 대량의 데이터를 DB에 저장하게 되므로
choihjhj.tistory.com
https://123okk2.tistory.com/405
JPA에서 외래키 사용
오늘은 JPA에서 외래키를 사용하는 방법을 작성해놓을까 한다. DB를 설계할 때 테이블간 관계 표현을 위한 외래키 사용은 필수이다. JPA에서는 이러한 외래키를 클래스 안에 클래스를 선언함으로
123okk2.tistory.com
[SpringBoot] created_at 처럼 엔티티 생성할 때 현재 날짜를 디폴트 값으로 지정하기 + 수정일 / Spring Da
엔티티가 만들어 질 때 현재 날짜를 디폴트 값으로 하는 방법에 대해 작성한 글입니다. 가령 게시글에 관한 테이블이라고 하면 created_at처럼 데이터가 추가되는 시점의 날짜를 저장하는 필드가
hulrud.tistory.com
'프로젝트' 카테고리의 다른 글
| (5)-2 SPA, MPA (0) | 2025.03.30 |
|---|---|
| (5)-1 Spring Boot3에서 Swagger 사용하기 : Swagger 설치, Swagger Config 설정 (0) | 2025.03.30 |
| (4) Rest API : Envelop pattern 봉투 패턴, 에러 공통 응답 형식 (1) | 2025.03.28 |
| (2) Issue, Feature Branch, PR 생성 방법 (0) | 2025.03.05 |
| (1) Jira/스크럼(Scrum)이란? 스크럼 진행 방식 / Sprint / Backlog (0) | 2025.02.03 |