본문 바로가기

Project24

[깃터디/Alarm] 스터디장 가입승인/거부 알림(fcm) api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡   회고 비동기 처리의 테스트 도중 아래와 같이 오류가 발생했다.Wanted but not invoked:fcmService bean.sendMessageSingleDevice( );-> at com.example.backend.study.api.event.service.FcmService.sendMessageSingleDevice(FcmService.java:37)Actually, there were zero interactions with this mock.Wanted but not invoked:fcmService bean.sendMessageSingleDevice( );-> at com.example.backend.study.api.eve.. 2024. 5. 16.
[깃터디/Alarm] 스터디 가입 신청 알림(fcm) api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡   회고 비동기처리 공부Spring Boot에서 비동기 처리는 멀티스레딩 환경에서 비동기적으로 실행되는 작업을 처리하는 것으로, 동기적인 방식과 비교해 처리 속도와 성능을 개선할 수 있다.비동기 처리 작업이란 멀티스레드를 사용하여 작업을 분리하고, 작업이 끝날 때까지 대기하지 않고 다른 작업을 처리할 수 있다.@Async어노테이션은 Spring이 제공하는 기능으로, 해당 어노테이션이 붙은 메서드를 비동기 처리로 실행할 수 있도록 해준다. 이를 사용하면 메서드가 실행되는 동안 다른 작업을 수행할 수 있으며, 작업의 완료 여부를 확인할 수 있다. @Async @EventListener public void applyMemberListener(A.. 2024. 5. 16.
[깃터디/Convention] 컨벤션 삭제 api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡   회고  // 컨벤션 삭제 @Transactional public void deleteStudyConvention(Long conventionId) { // Convention 조회 StudyConvention studyConvention = studyConventionRepository.findById(conventionId).orElseThrow(() -> { log.warn(">>>> {} : {} studyConventionRepository.findById(conventionId)를 통해 데이터베이스에서 해당 ID를 가진 StudyConvention 객체를 찾고 객체가 존재하면, stu.. 2024. 5. 11.
[깃터디/Convention] 컨벤션 수정 api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡   회고  @Test @DisplayName("컨벤션 수정 테스트") public void updateStudyConvention() { //given User savedUser = userRepository.save(generateAuthUser()); StudyInfo studyInfo = StudyInfoFixture.createDefaultPublicStudyInfo(savedUser.getId()); studyInfoRepository.save(studyInfo); StudyMember leader = StudyMemberFixture.createStudyMemberLe.. 2024. 5. 11.
[깃터디/Convention] 컨벤션 조회 api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡   회고 비즈니스 로직을 구현할때 그에 맞는 컨트롤러, 서비스 구현도 중요하지만 테스트를 작성하는 과정이 중요하다고 느낀다. CRUD에서 R은 유저에게 보여줘야할 정보들이기 때문에 특히나 테스트가 더욱 중요하다고 느낀다. // StudyInfoId로 Convention 전체 가져오기 List findStudyConventionListByStudyInfoId_CursorPaging(Long studyInfoId, Long cursorIdx, Long limit);페이지네이션중에서 커서 기반 페이지네이션 (Cursor-based Pagination) 를 사용하여 구현했다.페이지 네이션이란 전체 데이터에서 지정된 갯수만 데이터를 전달하는 방법을 말하며.. 2024. 5. 11.
[깃터디/Convention] 컨벤션 등록 api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡   회고  @ApiResponse(responseCode = "200", description = "컨벤션 등록 성공") @PostMapping("/") public JsonResult registerStudyConvention(@AuthenticationPrincipal User user, @RequestParam(name = "studyInfoId") Long studyInfoId,StudyConventionController 에서 studyInfoId 를 @RequestParam 어노테이션 즉, 쿼리 파라미터로 처리를 했었지만 쿼리 파라미터는 주로 f.. 2024. 5. 11.
[깃터디/Member] 스터디에 속한 스터디원 조회 api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡   회고 구현하면서 매번 느끼지만 CRUD 중에서 R이 제일 어렵다고 느껴진다,,(나만그런가?)현재까지 구현한 모든 Read 작업은 성능 최적화 없이 모든 데이터셋을 조회하고 있는데(프론트에서 필요한 데이터가 추가적으로 생기면 그때 가서 추가하는 것이 제거보다 힘들기 때문에 일단 모두 조회) 나중에 가서 코드 리팩토링 하고 쿼리 최적화와, 불필요 데이터들을 제거 등등을 해줘야겠다고 느낀다. StudyMemberRepositoryCustom.java // StudyInfoId와 orderByScore 를 통해 스터디의 모든 멤버들을 기여도별 or 가입순 정렬하여 조회한다. public List findStudyMembersByStudyInfoIdO.. 2024. 5. 11.
[깃터디/Member] 스터디 가입 신청 목록 조회 api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡   회고 비즈니스 로직을 구현할때 그에 맞는 컨트롤러, 서비스 구현도 중요하지만 테스트를 작성하는 과정이 중요하다고 느낀다. CRUD에서 R은 유저에게 보여줘야할 정보들이기 때문에 특히나 테스트가 더욱 중요하다고 느낀다. // StudyInfoId를 통해 승인 대기중인 멤버들의 가입신청 목록을 가져온다. List findStudyApplyListByStudyInfoId_CursorPaging(Long studyInfoId, Long cursorIdx, Long limit);페이지네이션중에서 커서 기반 페이지네이션 (Cursor-based Pagination) 를 사용하여 구현했다.페이지 네이션이란 전체 데이터에서 지정된 갯수만 데이터를 전달하는 .. 2024. 5. 11.
[깃터디/Member] 스터디원 강퇴, 스터디원 탈퇴 api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡   회고  // 삭제할 StudyTodoMapping의 ID 조회 List todoMappingIds = queryFactory .select(studyTodoMapping.id) .from(studyTodoMapping) .join(studyTodo).on(studyTodoMapping.todoId.eq(studyTodo.id)) .where(studyTodo.studyInfoId.eq(studyInfoId) .and(studyTodo.todoDate.after(LocalDate.no.. 2024. 5. 11.
[깃터디/Member] 스터디장 가입 신청 승인/거부 api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡   회고  // 신청대기중인 유저가 아닌경우 예외처리 if (applyMember.getStatus() != StudyMemberStatus.STUDY_WAITING) { log.warn(">>>> {} : {} Java에서는 enum 유형을 비교할 때 == 연산자나 != 연산자를 사용할 수 있다. 이는 enum 인스턴스가 고유하며 싱글턴처럼 동작하기 때문인데 즉, StudyMemberStatus.STUDY_WAITING은 StudyMemberStatus 열거형에서 유일한 인스턴스이기 때문이다. 그럼 equals 메서드는 언제쓸까??equals 메소드는 객체 내용의 동등성을 비교할 때 사용된다. 두 객체가 같은 타.. 2024. 5. 11.