[스프링] 습관 기록 crud 만들기
아무리 인강을 보려해도 흥미가 없고, 뭔가 보는게 너무 어려워서 그냥 냅다 만들고 후에 인강으로 보충해보려고한다.
역시 뭔가 필요해야 끝까지 잘 보는 나로써는.. 인강은 늘 어렵다.
그래서 대략적으로 아이디어를 만들고 빠르게 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 어떻게 만들지..