프로젝트

(3) 알림 엔티티 생성

nkdev 2025. 3. 5. 09:42

 

@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;
}

 

 



https://choihjhj.tistory.com/entry/JPA-Entity-PK%EB%8A%94-bigintMySQL-Longjava-%ED%83%80%EC%9E%85%EC%9C%BC%EB%A1%9C-%ED%95%B4%EC%95%BC-%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0

 

[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

 

https://hulrud.tistory.com/76

 

[SpringBoot] created_at 처럼 엔티티 생성할 때 현재 날짜를 디폴트 값으로 지정하기 + 수정일 / Spring Da

엔티티가 만들어 질 때 현재 날짜를 디폴트 값으로 하는 방법에 대해 작성한 글입니다. 가령 게시글에 관한 테이블이라고 하면 created_at처럼 데이터가 추가되는 시점의 날짜를 저장하는 필드가

hulrud.tistory.com