프로젝트 3일차를 맞이했다.
회의 결과 내가 담당할 부분은 목표 페이지였다.
우리가 진행하는 프로젝트는 유저가 100일간 진행할 목표를 세우고 매일매일 체크할 수 있도록 도와주는 서비스이고, 그 중 유저가 등록할 목표와 관련된 기능을 구현하는 것이 내가 맡은 부분이다.
일단 API 명세와 ERD를 기반으로 엔티티 먼저 작성했다.
@Entity
@Table(name = "resolutions")
class Resolution(
@Column(name = "title", nullable = false)
var title: String,
@Column(name = "description", nullable = false)
var description: String,
@ManyToOne
@OnDelete(action = OnDeleteAction.CASCADE)
@JoinColumn(name = "author")
val author: Users,
@Column(name = "complete_status")
val completeStatus: Boolean = false,
@Column(name = "daily_status")
val dailyStatus: Boolean = false,
@Column(name = "progress")
val progress: Long = 0,
@Column(name = "category")
var category: String,
@Column(name = "like_count")
val likeCount: Long = 0
): BaseEntity() {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "aim_id")
val id: Long? = null
@Column(name = "deadline")
val deadline: LocalDateTime = createdAt.plusDays(100)
위 코드에서 상속받는 BaseEntity는 프로젝트 내에서 거의 대부분의 테이블에서 사용중인 생성일, 수정일을 담고 있는 엔티티다. 이전 프로젝트를 진행하면서 다른 팀원이 사용했던 방법이다.
BaseEntity는 아래와 같다.
@MappedSuperclass
@EntityListeners(AuditingEntityListener::class)
abstract class BaseEntity {
@Column(columnDefinition = "TIMESTAMP(6)", name = "created_at", nullable = false, updatable = false)
@CreatedDate
var createdAt: LocalDateTime = LocalDateTime.now()
protected set
@Column(columnDefinition = "TIMESTAMP(6)", name = "updated_at", nullable = false)
@LastModifiedDate
var updatedAt: LocalDateTime = LocalDateTime.now()
protected set
}
막상 가져와 보니 처음보는 어노테이션이 있어 정리해봤다.
@MappedSuperclass
해당 클래스는 엔티티가 아니며, 테이블로 매핑되지 않는 클래스임을 알려주는 어노테이션이다.
이 클래스를 상속하는 엔티티 클래스들이 createdAt, updatedAt 필드를 테이블 컬럼으로 상속받아 사용할 수 있게 해 준다.
@EntityListeners(AuditingEntityListener.class)
엔티티의 생명주기 이벤트를 처리하기 위한 리스너를 지정한다. 여기서 AuditingEntityListener는 Spring Data JPA의 영속성 컨텍스트가 엔티티를 생성하거나 수정할 때 @CreatedDate와 @LastModifiedDate 가 붙은 필드를 자동으로 갱신해 준다. @CreatedDate와 @LastModifiedDate는 이름 그대로 생성일과 최종 수정일이다.
protected set
속성의 게터를 제한하는 방법이다. 클래스 자체 또는 상속받은 하위 클래스 내부에서만 수정이 가능하게 해 주며 이 필드들이 클래스 외부에서 임의로 수정되는 것을 막아준다.
>> 공부를 위해 따로 블로그 글을 작성했다.
나머지 controller와 service는 특별한 점 없이 하던대로 작성했다.
물론 틀만 잡아놓은 거라 기획한 기능을 구현하기 위해서는 많은 수정과 추가 내용이 들어가야 할 것이다.
'캠프 개발일지' 카테고리의 다른 글
개발일지 - 9일차: 좋아요 기능 추가 (0) | 2024.03.06 |
---|---|
개발일지 - 8일차: daily Check 추가 (4) | 2024.03.05 |
개발일지 - 1일차 : S.A. 작성 및 아이디어 회의 (0) | 2024.02.27 |
샤ㅣ (0) | 2024.01.16 |
TIL - 23.12.11 (0) | 2023.12.12 |