→ 근데 JPA 형식으로 바꾸면서 좀 수정을 했다.
properties.yml 파일에서
driver-class-name: com.mysql.cj.jdbc.Driver
이 부분이 로딩이 안돼서 엄청 고생했다.
build.gradle 파일에서 다음을 수정하고 해결했다.
implementation 'mysql:mysql-connector-java:8.0.32'
Boolean에서 문제가 발생했다.
Mysql에는 Boolean 타입 대신 TinyInt(1)을 사용한다고 한다.
그래서 다음과 같이 수정해서 해결했다.
그리고 check라는 변수도 사용하면 안되는 것 같다.
@Column(columnDefinition = "TINYINT(1)", nullable = false)
@ColumnDefault("0")
private Boolean success; // 예약 성공 여부
노션을 만들고 팀원 초대를 한 후, API 명세서를 작성하였다.
이를 통해 로직을 생성할 예정이다.
https://golden-adasaurus-44e.notion.site/API-c2b39a011549436baec821852cabdb72
리포지토리를 클래스 파일로 만들었는데,
인터페이스로도 만들 수 있다는 것을 알았다.
근데 김영한씨는 클래스로 쓰시네,,
아직까지 jpa 사용에 문제는 없다.
최대한 프론트에서 편하게 작업했음 해서 꼼꼼히 만들었다.
확실히 Jpa가 자바 코드를 활용할 수 있어서 좋은 거 같다.
예로, 첫번째 컬럼 가져오고 싶을 때 일단 리스트로 갖고 오고 get(0) 쓰면 된다.
로그인 세션 유지 API 를 구현했다.
jquery 어려엉,, 낼 예약 관련 로직 구현할 때 사용해봐야겠다.
이번에는 JpaRepository<Reservation, Long>
을 extends 해서
interface 형식으로 ReservationRepository를 구현했다.
프론트 측에서 조금 더 쉽게 로직에 접근 할수 있도록 다양한 api를 만들어주려고 노력했다.
Enum 값 같은 경우, EnumType.STRING
으로 처리해두지 않으면 기본값은 정수값으로 들어가므로 string으로 바꿔주려면 다음과 같이 처리해주어야 한다.
이렇게 하면 그냥 데이터 타입을 String으로 변경하지 않고,
ReservationStatus
Enum 타입으로 넘겨줘도 JPA가 알아서 처리해준다.
@Enumerated(EnumType.STRING)
private ReservationStatus status;
// 예약 상태 RESERVED, FINISHED, CANCELED
아 특히 예약 로직 같은 경우, 시간을 처리해줘야 했었는데
이건 나중에 프론트 측과 더 이야기를 나눠야 할 거 같다.
시간 지나면 자동으로 예약 상태가 FINISHED로 바뀌어야 하는데ㅣ,,,
이걸 어떻게 처리해야할지?
예약 조건은 다음으로 정했다.
아 그리고 외래키로 엮인 애들 삭제할 때는 cascade 항상 생각해줘야 한다.
JPA update 같은 경우,
sevice 단에서 set만 해도 자동 update가 된다!
Transaction 있는 서비스단상에서 진행해야한다.
DTO를 따로 만들어야 할 거 같다.. 양방향으로 바꿔주니까 로그 찍을 때랑 리턴할 때랑 에러가 겁나 난다.ㅠㅠㅠ
프론트 측이랑 연동을 완료했다.
다행히 코드에서 큰 수정 없이 잘 넘어갔다.
근데 Session의 경우, 스프링에서 Session에 값을 넣어두면,
프론트 측에서는 쿠키에서 가져올 수 있다.
이 프로젝트는 특히 예약 시스템이라 시간을 다루는 일이 많았는데 프론트에서 시간을 보내줄 때 9시간이 차이나게 오더라,,
암튼 그리고 하루 24시간에서 예약 있는 시간대는 1로 해서 리턴하는 로직을 만들었다. 잘 동작해서 뿌듯하다.
log 문제를 해결했다.
@toString(exclude="")
속성을 사용해주면 된다.
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());
// }
}