공부용/스프링 || 스프링부트

[스프링] 습관 기록 crud 만들기

alpakaka 2025. 2. 17. 21:57

아무리 인강을 보려해도 흥미가 없고, 뭔가 보는게 너무 어려워서 그냥 냅다 만들고 후에 인강으로 보충해보려고한다.

역시 뭔가 필요해야 끝까지 잘 보는 나로써는.. 인강은 늘 어렵다.

그래서 대략적으로 아이디어를 만들고 빠르게 crud 를 만들어보려고한다.

일단 대략 아이디어는 다음과 같다.

요즘 습관을 만들고 있는데 구글 태스크는 좀 뭔가 하고있다고 잘 보이지 않는다. 한 건 지우는 방식이라 그런 것 같다.

그래서 반대로 습관을 지키면 보여주도록 해보고 싶었다. 

이걸 위해서 crud를 대략적으로 만들어보자.

 

일단 아주 라이트하게 기능을 적어본다.

- 지킬 습관을 저장할 수 있다.

- 습관을 불러올 수 있다.

- 습관을 삭제할 수 있고 수정할 수 있다.

- 습관 완료를 체크하거나 해제할 수 있다.

- 한달동안 완료된 습관 통계를 확인할 수 있다.

 

그리고 추가적으로 gpt 와 함께 조금 더 아이디어를 넣어보았다.

지피티가 엔드포인트도 만들어주었다.

기능 HTTP Method URL 설명

습관 추가 POST /habits 새로운 습관을 등록

습관 목록 조회 GET /habits 모든 습관 리스트 반환

습관 수정 PUT /habits/{id} 특정 습관 정보 수정

습관 삭제 DELETE /habits/{id} 특정 습관 삭제

습관 완료 체크 POST /habits/{id}/complete 습관 완료 기록 추가

한 달 완료 횟수 조회 GET /habits/{id}/stats 한 달 동안 몇 번 완료했는지 조회

 

역시 편하다.

그리고 DB를 설계해보자.

 

음.. 사실 그리 어렵지 않아 보인다.

간단하게 스윽 만들어본다. 혼자사용할거기때문에 user id조차도 필요 없다. 유저를 구분할 필요가 없기 때문이다. 

 

Habit

NAME TYPE DESCRIPTION
id int habit_id
name varchar not null
start_date date 습관 시작일
end_date date 습관 데드라인
사용자가 안 주면 3개월뒤까지
created_at TIMESTAMP  
deleted_at TIMESTAMP  
updated_at TIMESTAMP  
status  ENUM('ACTIVE', 'PAUSED', 'DELETED') DEFAULT 'ACTIVE' 활성상태 확인용

 

Habit Log

NAME TYPE DESCRIPTION
id int log_id
habit_id int foreign key (habit)
completed_date TIMESTAMP 습관을 완료한 날짜

 

자 대략적인 건 끝났으니 한번 만들어본다.

 

일단 스프링부트에서 프로젝트를 만들어본다.

지피티와 함께 만들고 있다.

일단 위에 나온 것 처럼 디비를 설정해줬다.

package com.example.habit_tracker.entity;

import jakarta.persistence.*;
import java.time.LocalDateTime;

@Entity
@Table(name = "habit_log")
public class HabbitLog {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @ManyToOne
    @JoinColumn(name = "habit_id", nullable = false)
    private Habit habit;

    private LocalDateTime completedDate;

    public HabbitLog() {}

    public HabbitLog(Habit habit, LocalDateTime completedDate) {
        this.habit = habit;
        this.completedDate = completedDate;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public Habit getHabit() {
        return habit;
    }

    public void setHabit(Habit habit) {
        this.habit = habit;
    }

    public LocalDateTime getCompletedDate() {
        return completedDate;
    }

    public void setCompletedDate(LocalDateTime completedDate) {
        this.completedDate = completedDate;
    }
}
package com.example.habit_tracker.entity;

import jakarta.persistence.*;

import java.time.LocalDate;
import java.time.LocalDateTime;

@Entity
@Table(name = "habit")
public class Habit {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private LocalDate startDate;

    @Column(nullable = false)
    private LocalDate endDate;

    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private Status status = Status.ACTIVE;

    @Column(updatable = false)
    private LocalDateTime createdAt = LocalDateTime.now();

    private LocalDateTime updatedAt = LocalDateTime.now();;
    private LocalDate deletedAt;

    public enum Status {
        ACTIVE, PAUSED, DELETED
    }

    public Habit() {}

    public Habit( String name, LocalDate startDate, LocalDate endDate, Status status) {
        this.name = name;
        this.startDate = startDate;
        this.endDate = endDate;
        this.status = status;
        this.createdAt = LocalDateTime.now();
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public LocalDate getStartDate() {
        return startDate;
    }

    public void setStartDate(LocalDate startDate) {
        this.startDate = startDate;
    }

    public LocalDate getEndDate() {
        return endDate;
    }

    public void setEndDate(LocalDate endDate) {
        this.endDate = endDate;
    }

    public Status getStatus() {
        return status;
    }

    public void setStatus(Status status) {
        this.status = status;
    }
}

여기서부터 django 와 다르다는 게 실감이 난다..

만드는 건 비슷한데 뭔가... 다르다..

어찌보면 또 색다른 느낌이라 슬슬 해보면 좋을 것 같다.

 

더 필요한 공부

mvc 와 객체지향..

crud 어떻게 만들지..