이번 주차는 메모의 CRUD를 구현하고 그것을 웹에 구현해, 24시간이 지나면 게시물(메모)이 저절로 사라지는 서비스를 만들었다. 스파르타코딩클럽의 왕초보시작반(웹개발 종합반1)을 들었던 사람이라면 내용이 파이썬의 Flask를 이용하는 것에서 자바의 Spring을 이용하는 것으로 바뀌었다고 생각하면 될 것 같다. 그래서 어떻게 보면 아는 사람한테는 별거 아닌 주차였고, HTML/CSS/JAVASCRIPT에 대한 기본기가 부족한 분들은 3주차가 의외로 길고 힘든 여정이 되었을 수도 있을 것 같다.
스프링 프레임워크는 RestController라는 것을 제공하는데 이게 진짜 편리하게 Get,Post,Put,Delete를 맵핑하는 어노테이션을 제공한다. 이...이게 다라고? 싶을 만큼 개발자는 크게 할 일이 없다. 다만 이것을 구현하기 위해서 DB와 상응하는 Repository 클래스를 생성하고, JPA에서 주어지는 다양한 도구들을 간편하게 사용하기만 하면 된다.
JPA가 여기서 얼마나 똑똑한 녀석이냐면, Memo 인스턴스들을 담고 있는 memoRepository에 . 하나를 찍기만 하면 이렇게 많은 Jpa 메소드들이 주렁주렁 달려나온다. 이것이 꼭 고정되어 있는 것만이 아니고 Memo 클래스가 가지고 있는 컬럼(멤버변수)에 따라 저절로 네이밍이 되어 보여지는 것까지 알 수 있다.
Supported keywords inside method namesKeywordSampleJPQL snippet
조건 | JPA 메소드 구현 | 그에 대응하는 SQL 쿼리문 (자동번역) |
Distinct | findDistinctByLastnameAndFirstname | select distinct … where x.lastname = ?1 and x.firstname = ?2 |
And | findByLastnameAndFirstname | … where x.lastname = ?1 and x.firstname = ?2 |
Or | findByLastnameOrFirstname | … where x.lastname = ?1 or x.firstname = ?2 |
Is, Equals | findByFirstname,findByFirstnameIs,findByFirstnameEquals | … where x.firstname = ?1 |
Between | findByStartDateBetween | … where x.startDate between ?1 and ?2 |
LessThan | findByAgeLessThan | … where x.age < ?1 |
LessThanEqual | findByAgeLessThanEqual | … where x.age <= ?1 |
GreaterThan | findByAgeGreaterThan | … where x.age > ?1 |
GreaterThanEqual | findByAgeGreaterThanEqual | … where x.age >= ?1 |
After | findByStartDateAfter | … where x.startDate > ?1 |
Before | findByStartDateBefore | … where x.startDate < ?1 |
IsNull, Null | findByAge(Is)Null | … where x.age is null |
IsNotNull, NotNull | findByAge(Is)NotNull | … where x.age not null |
Like | findByFirstnameLike | … where x.firstname like ?1 |
NotLike | findByFirstnameNotLike | … where x.firstname not like ?1 |
StartingWith | findByFirstnameStartingWith | … where x.firstname like ?1 (parameter bound with appended %) |
EndingWith | findByFirstnameEndingWith | … where x.firstname like ?1 (parameter bound with prepended %) |
Containing | findByFirstnameContaining | … where x.firstname like ?1 (parameter bound wrapped in %) |
OrderBy | findByAgeOrderByLastnameDesc | … where x.age = ?1 order by x.lastname desc |
Not | findByLastnameNot | … where x.lastname <> ?1 |
In | findByAgeIn(Collection<Age> ages) | … where x.age in ?1 |
NotIn | findByAgeNotIn(Collection<Age> ages) | … where x.age not in ?1 |
True | findByActiveTrue() | … where x.active = true |
False | findByActiveFalse() | … where x.active = false |
IgnoreCase | findByFirstnameIgnoreCase | … where UPPER(x.firstname) = UPPER(?1) |
3주차의 마지막 숙제는 구현한 CRUD에서 조금 더 기능을 보태, 데이터베이스에 저장되어 있는 모든 데이터를 GET 해오는 것이 아니라, 지금으로부터 24시간 이내의 게시물만 보여주는 기능을 구현하는 것이었는데, 친절한 JPA 덕분에 크게 오래 걸릴 것도 없이,
memoRepository.findAll() 모든 메모를 리스트 형태로 불러와!
memoRepository.findAllOrderByModifiedAtDesc() 모든 메모를 리스트 형태로 불러와서 수정한 시간 순으로 정렬해!
memoRepository.findAllByModifiedAtBetweenOrderByModifiedAtDesc(LocalDateTime start, LocalDateTime end)
모든 메모 중에 start 시점부터 end 시점 사이에 등록(수정)된 글들만 리스트 형태로 불러와서 수정한 시간 순으로 정렬해!
이렇게 유연하게 메소드 이름으로 구현할 수 있는 것이다. 뭐 조건문을 걸고 필터를 걸고 할 필요도 없이 말이다. 진짜 짱이지 않음...?? 덕분에 손 쓸 것도 없이 금방 이런 웹서비스를 만들 수 있었다.
이 서비스를 여러사람이 쓸 수 있게 하려면 추가해야 할 기능들이 뭐가 있을까? 일단 사용자의 uid를 글 작성 시점에 생성하는 함수를 손봐야 할 것이다. 지금 상태에서는 누가 쓴 글이든 내가 수정할 수 있고, 삭제할 수도 있다. 또 동일한 사람이 여러개의 글을 작성해도 각각 다른 uid로 보이기 때문에 여러사람이 쓴 것처럼 읽힐 수 있다. 이 부분에 대한 수정이 필요하겠지. 또 내가 작성한 글이 아니라면 애초에 수정버튼이나 삭제버튼이 보이지 않는 것도 방법이겠공. 또 로컬데이트타임으로 생성된 작성(수정) 시점이 YYYY-MM-DDTHH:MM:SS_ms 이렇게 다소 장황한 면이 있다. 어차피 최근 24시간 동안의 글만 보이는 것이라면 이 부분의 포맷을 n시간 전으로 표시되게 하거나, 14:00:34 이렇게 간략하게 표시되게 하는 방법이 있겠지. 아직은 자바를 이제야 막 만질 수 있게 된 단계라 자바스크립트였다면 진작에 찾아냈을 해결책(moment 패키지를 쓴다던지..)이 떠오르지는 않지만, 후에 조금 더 손보면 가벼운 친목용 롤링페이퍼 사이트 정도는 만들 수 있지 않을까 해서 기록ㅎㅎ
암튼 너무 재미있었다. 스파르타코딩클럽 잘됐으면 좋겠다:D
'Java' 카테고리의 다른 글
<JAVA> DTO가 뭐예요? 꼭 써야 하나요? (0) | 2021.11.08 |
---|---|
웹개발의 봄, 스프링 5주차 (최저가셀렉샵) [스파르타코딩클럽] (0) | 2021.08.19 |
웹개발의 봄, 스프링 4주차 (최저가셀렉샵) [스파르타코딩클럽] (0) | 2021.08.18 |
웹개발의 봄, 스프링 2주차 (내머리터짐) [스파르타코딩클럽] (0) | 2021.08.15 |
웹개발의 봄, 스프링 1주차 (+자바) [스파르타코딩클럽] (0) | 2021.08.12 |
댓글