
이제 서비스 하나를 구현하였으니 A부터 Z까지 혼자 힘으로 어플을 다시 만들라는 숙제가 나갈 줄 알았는데..
의외로 간단한 구글링을 통해 해결할 수 있는 숙제를 내주셨다.
문제는 다음과 같은데..

사실 여기까지는 구현해야 타임라인 서비스 어플리케이션의 완성이라고 할 수 있겠지..
건드려야 할 부분은 그리 많지 않다.
일전에 서버를 구축하면서 만들어놓은 *.Repository.java / *.Controller.java
이 두 개 파일에 있는 JPA 메서드만 조금씩 손봐주면 된다.
프레임워크에서 지원하는 규칙을 구글링해서 필요한대로 가져다가 쓸 수 있는 능력을 기르는 문제 같다.
아! JPA에서 공식적으로 지원하는 문서 규격이 있으니 참고하면 두고두고 요긴하게 쓸 수 있을 것이다.
Spring Data JPA - Reference Documentation
Spring Data JPA - Reference Documentation
Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del
docs.spring.io
읏차! 이제 소스코드를 본격적으로 해부해보는 시간을 갖도록 하겠다.
1. MemoRepository.java
public interface MemoRepository extends JpaRepository<Memo, Long>{
List<Memo> findAllByModifiedAtBetweenOrderByModifiedAtDesc
(LocalDateTime start, LocalDateTime end);
}
딱 필요한 부분만 긁어왔다.
어짜피 추상 클래스이기 때문에 코드가 토 나올 정도로 복잡할 수가 없다.
우선 MemoRepository 클래스가 JpaRepository<Memo, Long>를 상속받는 부분부터 시작한다.
거의 조상격이나 다름없는 자바 클래스나 마찬가지이다.
그.. 상속과 다형성 개념은 빠른 시일 내로 따로 정리할테니 우선 차치하고!
Memo 클래스에서 Key (name)값이 Long 타입인 녀석을 가져다가 쓰겠다는 의도인 Generics<>로 처리해주고 있다.
참고로 저 Memo 클래스는 프로젝트에서 사용될 모든 변수를 저장하고 있는 녀석이다.
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
요렇게 DB 서버에서 1, 2, 3 ... 식으로 테이블 넘버를 지정해주기 위해 변수명을 id로 선언해줬을 뿐이다.
중요한 부분은 JPA에서 너 이렇게 안쓰면 죽어? 식으로 정해준 JPA 메서드이다.
findAllByModifiedAtBetweenOrderByModifiedAtDesc()
워메 시발꺼 이게 뭐시여?
쫄지 말아라.
앞 글자마다 낙타등처럼 따로 구분을 해주지 않았는가?
차근차근 풀어보면 된다.
find All By ModifiedAt Between Order By ModifiedAt Desc
이렇게 띄어쓰기를 해주면 좀 알아보기가 쉬울까?
find all은 SQL에서 가장 많이 쓰이는 'SELECT * FROM TABLE WHERE ~ ' 절과 동일한 기능을 수행한다.
'WHERE ~' 절처럼 BY 이하에 해당하는 조건은 모조리 조회하겠다는 뜻이다.
ModifiedAt은 미리 만들어놓은 TimeStamped.java 클래스에서 가지고 온 변수명이다.
다음 코드블록을 참고하길 바란다.
public abstract class TimeStamped {
@CreatedDate
private LocalDateTime createAt;
// 생성시간
@LastModifiedDate
private LocalDateTime modifiedAt;
// 수정시간
}
즉! 데이터의 수정시간을 기준으로 조회하겠다는 의도를 가지고 있는 것이다.
Between은 어제 00시 00분 00초부터 금일 23시 59분 59초 사이에 CRUD된 데이터들을 24시간으로 제한한 것이다.
다음 코드블록에서 더 자세히 다룰 수 있을 것이다.
ORDER BY는 정렬기준!
DESC는 수정시간을 내림차순.. 그러니까 최신 순으로 정렬하겠다는 뜻이다.
참고로 오름차순으로 정렬할 때는 ASC로 정의한다.
필자가 자꾸 SQL을 들먹이는 이유는 별 거 없다.
그냥 처음 자바를 배울 때, DB는 오라클로 공부했기 때문이다.
뒤지게 어렵기는 했는데 책으로 한권 떼고 나니까 이후 DB 관련 내용이 나올 때 이해가 빨리 되더라.
독자 여러분들도 시간을 내서 DB를 따로 공부하길 바란다.
정말 두고두고 유용하게 써먹는다.
책도 소개해줄테니 한 권 다 떼고 난 다음에는 떡볶이 시켜먹어라.
Do it! 오라클로 배우는 데이터베이스 입문 | 이지훈 | 이지스퍼블리싱 - 교보문고 (kyobobook.co.kr)
Do it! 오라클로 배우는 데이터베이스 입문 - 교보문고
비전공자도 기초부터 확실하게! | 기초가 탄탄해야 실무에서 인정받습니다!실무에서 많이 쓰는 순서대로 기본기를 익히세요.현업 프로그래머 저자가 개념부터 SQL, PL/SQL까지 확실하게 기본기를
www.kyobobook.co.kr
2. MemoController.java
@GetMapping("/api/memos")
public List<Memo> getMemos(){
LocalDateTime start = LocalDateTime.of
(LocalDate.now().minusDays(1), LocalTime.of(0,0,0));
// Yesterday: Before 24 Hour
LocalDateTime end = LocalDateTime.of(LocalDate.now(), LocalTime.of(23,59,59));
// Today: Current Time
return memoRepository.findAllByModifiedAtBetweenOrderByModifiedAtDesc(start, end);
}
스프링에서 구축한 Controller단은 Get 이외에도 Post / Put / Delete 기능을 모두 수행하고 있기 때문에..
원래는 저거보다 당연히 내용이 훨씬 많다.
이번에도 설명이 필요한 부분만 따로 긁어온 것이다.
우선적으로 클래스를 하나 만들어주고 있지?
Memo 클래스에서 만들어놓은 변수들을 배열 형태로 가져다가 쓰겠다는 의미로 List<Memo>를 선언해줬다.
getMemos는 그냥 임의로 메서드명을 지어준 것 뿐이니 너무 게의치 않아도 좋다.
핵심은 LocalDateTime이란 변수이다.
한 놈은 LocalDateTime start;로 24시간 전인 어제의 시간을 저장하려고 한다.
다른 한 놈은 LocalDateTime end;로 24시간 이후인 오늘의 시간을 저장해주려고 한다.
LocalDateTime.of() 이하에 저장하고자 하는 값들을 주의깊게 살펴보길 바란다.
Yesterday는 *.minusday(1)로 지정해줬다.
필자의 경우에는 숙제대로 구글링 해본 다음 코드에 적용한건데 이상하게 Illigal Exception이 뜨더라..
바로 요놈 때문이다.
find All By ModifiedAt Between Order By ModifiedAt Desc
원본 파일에는 Between 같은게 없었어..
그러니까 findAllByModifiedAtOrderByModifiedAtDesc로 내림차순만 적용하고 끝났던거지
그 저런 빡대가리 같은 실수 하지 말고 리턴문을 각별히 신경쓰도록 하자.
필자는 습관적으로 리턴을 빼먹고 이게 왜 실행이 안되징..? 하면서 머리카락 쥐어뜯은 적이 한 두번이 아니다.
숙제에 관한 코드 리뷰는 여기에서 마치겠다.
하지만 난 그것과 별개로 처음부터 끝까지 다시 서버단부터 만든 다음에
변태같이 코드리뷰를 따로 작성해서 올릴 예정이다.
이대로 다음 챕터로 넘어가자니 뭔가 찝찝해..
소스코드 전체를 보고 싶다면 필자의 Github를 참고하기 바란다.
한 2 ~3일 동안은 진도를 스탑하고 복습 위주로 돌아가서 꼭꼭 씹어먹는 게 좋을 거 같음
그럼 수구..
academy3746/week03: 타임라인 서비스 구현! (github.com)
GitHub - academy3746/week03: 타임라인 서비스 구현!
타임라인 서비스 구현! Contribute to academy3746/week03 development by creating an account on GitHub.
github.com
'[SPRING_입문] > Code Review' 카테고리의 다른 글
[Domain] 나만의 셀렉샵 배포하기! (Z) (0) | 2022.07.04 |
---|---|
[Localhost] 나만의 셀렉샵 만들기! (A-Y) (0) | 2022.06.29 |
[Localhost] Timeline Service 구축 (Server / Client) (0) | 2022.06.23 |
MVC (Model_02) 기법을 이용한 게시판 구축 (上) (0) | 2022.06.19 |