회의실 예약 시스템 프로젝트 일지

Jimin·2023년 3월 25일
0

프로젝트 일지

목록 보기
1/3
post-thumbnail

2023.03.27

ERD를 만들었다.

→ 근데 JPA 형식으로 바꾸면서 좀 수정을 했다.

JPA 형식으로 VO를 작업했다.

properties.yml 파일에서

driver-class-name: com.mysql.cj.jdbc.Driver

이 부분이 로딩이 안돼서 엄청 고생했다.

build.gradle 파일에서 다음을 수정하고 해결했다.

implementation 'mysql:mysql-connector-java:8.0.32'

VO

Boolean에서 문제가 발생했다.
Mysql에는 Boolean 타입 대신 TinyInt(1)을 사용한다고 한다.
그래서 다음과 같이 수정해서 해결했다.
그리고 check라는 변수도 사용하면 안되는 것 같다.

@Column(columnDefinition = "TINYINT(1)", nullable = false)
@ColumnDefault("0")
private Boolean success; // 예약 성공 여부

2023.03.31

노션을 만들고 팀원 초대를 한 후, API 명세서를 작성하였다.
이를 통해 로직을 생성할 예정이다.

https://golden-adasaurus-44e.notion.site/API-c2b39a011549436baec821852cabdb72


2023.04.01 ~ 2023.04.07

Room API 로직 완성

리포지토리를 클래스 파일로 만들었는데,
인터페이스로도 만들 수 있다는 것을 알았다.

근데 김영한씨는 클래스로 쓰시네,,
아직까지 jpa 사용에 문제는 없다.

Management API 로직 완성

최대한 프론트에서 편하게 작업했음 해서 꼼꼼히 만들었다.
확실히 Jpa가 자바 코드를 활용할 수 있어서 좋은 거 같다.
예로, 첫번째 컬럼 가져오고 싶을 때 일단 리스트로 갖고 오고 get(0) 쓰면 된다.

Member

  • cnt 컬럼 추가
  • cnt 증가, 감소 메소드 추가

Filter 생성

  • 요청시, log에 url 찍히도록 설정

Exception 파일 추가

  • NotEnoughCntException

2023.04.09

로그인 세션 유지 API 를 구현했다.
jquery 어려엉,, 낼 예약 관련 로직 구현할 때 사용해봐야겠다.


2023.04.10

Reservation 관련 API를 구현했다.

이번에는 JpaRepository<Reservation, Long> 을 extends 해서
interface 형식으로 ReservationRepository를 구현했다.

프론트 측에서 조금 더 쉽게 로직에 접근 할수 있도록 다양한 api를 만들어주려고 노력했다.

Enum 처리

Enum 값 같은 경우, EnumType.STRING 으로 처리해두지 않으면 기본값은 정수값으로 들어가므로 string으로 바꿔주려면 다음과 같이 처리해주어야 한다.
이렇게 하면 그냥 데이터 타입을 String으로 변경하지 않고,
ReservationStatus Enum 타입으로 넘겨줘도 JPA가 알아서 처리해준다.

@Enumerated(EnumType.STRING)
private ReservationStatus status; 
// 예약 상태 RESERVED, FINISHED, CANCELED

아 특히 예약 로직 같은 경우, 시간을 처리해줘야 했었는데
이건 나중에 프론트 측과 더 이야기를 나눠야 할 거 같다.
시간 지나면 자동으로 예약 상태가 FINISHED로 바뀌어야 하는데ㅣ,,,
이걸 어떻게 처리해야할지?

예약 조건은 다음으로 정했다.

  • 회원이 로그인되어 있어야 한다.
  • 회원의 cnt 횟수가 차감된다. → 이 때, 차감 횟수가 0보다 작을 경우 오류가 터진다.
  • 회원이 예약을 원하는 시간에 이미 예약이 되어 있다면, 해당 시간 사이에 count(*) 값을 조사하여 0이 아니라면 예약을 하지 못한다.

아 그리고 외래키로 엮인 애들 삭제할 때는 cascade 항상 생각해줘야 한다.

오류가 났던 점들

  • 오타
  • update인데 Transactional(readonly=true) 인채로 둔 것
  • delete문은 그냥 다 오류 나서 그냥 오리지널 버전 이용했다.
    이유가 뭘까?ㅠㅠ

JPA Update

JPA update 같은 경우,
sevice 단에서 set만 해도 자동 update가 된다!
Transaction 있는 서비스단상에서 진행해야한다.


2023.04.14

DTO를 따로 만들어야 할 거 같다.. 양방향으로 바꿔주니까 로그 찍을 때랑 리턴할 때랑 에러가 겁나 난다.ㅠㅠㅠ

프론트 측이랑 연동을 완료했다.
다행히 코드에서 큰 수정 없이 잘 넘어갔다.

근데 Session의 경우, 스프링에서 Session에 값을 넣어두면,
프론트 측에서는 쿠키에서 가져올 수 있다.

이 프로젝트는 특히 예약 시스템이라 시간을 다루는 일이 많았는데 프론트에서 시간을 보내줄 때 9시간이 차이나게 오더라,,

암튼 그리고 하루 24시간에서 예약 있는 시간대는 1로 해서 리턴하는 로직을 만들었다. 잘 동작해서 뿌듯하다.


2023.04.25

log 문제를 해결했다.
@toString(exclude="") 속성을 사용해주면 된다.


2023.04.28

  • 여러 오류를 리액트에 넘겨주고 해결하는 방법을 사용했다.
  • 스케줄러 애노테이션을 사용해서 매달 1일 0시 0분에 cnt 값이 리셋되도록 설정했다.
public class SchedulerFunction {
    private final ManagementService managementService;

    @Scheduled(cron = "0 0 0 1 * ?", zone="Asia/Seoul") // 매달 1일 0시 0분에 실행
    public void resetValue() {
        managementService.resetCntAll();

        log.info("CNT scheduling batch = {}", LocalDateTime.now());
    }

//    @Scheduled(initialDelay = 10000, fixedDelay = 10000)
//    public void runAfterTenSecondsRepeatTenSeconds() {
//        log.info("10초 후 실행 => time : " + LocalTime.now());
//    }
}
profile
https://github.com/Dingadung

0개의 댓글