Member partner = memberRepository.findById(respondentId).orElse(null);
Member member = memberRepository.findByUsername(username).orElseThrow(
() -> new IllegalArgumentException("아이디가 존재하지 않습니다.")
);
if (!passwordEncoder.matches(loginRequestDto.getPassword(), member.getPassword())) {
throw new IllegalArgumentException("비밀번호가 일치하지 않습니다.");
}
역할 분담을 하고 본격적으로 프로젝트가 시작되었다.
내가 맡은 부분이 비교적 쉬운 것 같아서 최대한 빨리하고 팀원분들께 작은 도움이라도 드릴 예정이다.
알고리즘과 개인공부, 면접준비, 운동까지 해야하는데 시간을 어떻게 써야할 지 모르겠다.
로그 찍는 법
private final Logger logger = LoggerFactory.getLogger("LoggerController 의 로그");
@Slf4j
@PageableDefault(size = 8) Pageable pageable
무한 스크롤에 쓰인다.
pageable을 jpa 함수 파라미터로 쓰면 스크롤이 된다!!!
Pageable pageable = PageRequest.of(0, 5, Sort.Direction.DESC, "level");
이 친구는 페이징 처리를 해주는 친구이다.
얘도 무한스크롤이 되지 않을까 싶다.
return new PageImpl<(returnPost,pageable,returnPost.size());
return 값을 PageImpl<>로 해주면 정보들을? 받을 수 있다.
여기 참고
@GetMapping("/bookreviews")
public Page<ReviewDetail> getReviews(
@PageableDefault(size = 5, sort = "createdDate", direction = Sort.Direction.DESC) Pageable pageable) {
Page<BookReview> reviewPage = reviewService.getReviews(pageable);
return reviewPage.map(ReviewDetail::from);
}
public Optional<BookReview> getReview(Long id) {
return bookReviewRepository.findById(id);
}
public static ReviewDetail from(BookReview review) {
return ReviewDetail.builder()
.id(review.getId())
.nickname(review.getUser().getNickname())
.rank(review.getRanking())
.bookBuyUrl(review.getBookBuyUrl())
.bookImageUrl(review.getBookImageUrl())
.title(review.getTitle())
.content(review.getContent())
.like(review.getLikeCount())
.createdDate(review.getCreatedDate())
.build();
}
고수분이 짜신 코드이다. 공부하고 참고하려고 해놨던 걸 이제야 올린다.
from은 볼때마다 신기하다.
public List<Member>findByPage(int age, int offset, int limit){
return em.createQuery("select m from Member m where m.age = :age order by m.username desc")
.setParameter("age", age)
.setFirstResult(offset)
.setMaxResults(limit)
.getResultList();
}
int age = 10;
PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, "username"));
Page<Member> page = memberRepository.findByAge(age, pageRequest);
List<Member> content = page.getContent();
long totalElements = page.getTotalElements();
for(Member m : content){
System.out.println("member = " + m);
}
Slice<Member> slice = memberRepository.findByAge(age, pageRequest);
slice는 일반 Page보다 limit + 1 해서 가져온다.
ex) 어플이나 웹 보면 더보기 버튼에 사용
Page 변수를 그대로 클라이언트로 내려준다?
그렇게 되면 엔티티가 변형되기 때문에 Dto로 변환해서 내려준다.
ex)
Page<Member> page = memberRepository.findByAge(age, pageRequest);
Page<MemberDto> toMap = page.map(member -> new MemberDto(member.getId(), member.getUsername(), null));
nested exception is org.hubernate.InstantiationException:No default constructor for entity
JPA에서 Entity는 기본 생성자를 가지고 있어야 하는 것 같다.
상단에 @NoArgsonstrucctor을 추가해준다.
만약 limit만 해주고싶다?
그렇다면 Page를 파라미터로 넣어주고 반환타입을 List로 해주면 된다!
규칙!
Main.class에 @EnableScheduling
추가!
scheduler 사용할 클래스에 @Component 등록
Method는 void 타입으로 만들고, 매개변수 사용 불가
scheduler 중
//현재 시간을 불러오는데, format해주면 string이 된다. 따라서 .parse를 사용하여 LocalDate 형식으로 맞춰준다.
LocalDate now = LocalDate.parse(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
//인증날짜가 현재 날짜보다 작은 경우. 즉 인증날짜가 지난 경우
if(confirmDate.isBefore(now)){
.isBefore
이외에도 isAfter
과 isEqual
이 있다.
프론트 인원이 1명으로 줄어서 스코프 욕심을 줄이고 최대한 백앤드쪽에서 할 수 있는 것을 찾다가 CI/CD를 해보자고 결론이 났고 도커와 젠킨스를 활용해서 무중단 배포를 도전해봤다. 쉽지 않아서 계속 잡고있는 상태다.