본문 바로가기
캠프 개발일지

개발일지 - 3일차: CRUD 및 기본 틀 작성(+kotlin 공부)

by JHBang 2024. 2. 28.

프로젝트 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