전체 글138 [깃터디/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. [깃터디/Member] 스터디 가입 취소 api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡 회고 // 대기중인 멤버인지 조회 Optional existingMember = studyMemberRepository.findByStudyInfoIdAndUserId(studyInfoId, user.getUserId()); // 멤버가 존재하지 않으면 예외 발생 if (existingMember.isEmpty()) { log.warn(">>>> {} : {} >>> {} : {} Java의 Optional 타입은 null 값을 직접 다루는 것을 피할 때 사용된다. 즉, Optional 은 값이 있을 수도 있고, 없을 수도 있는 컨테이너 객체인데 값이 있으면 Optional 은 해당 .. 2024. 5. 11. [깃터디/Member] 스터디 가입 신청 api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡 회고 스터디 가입 신청은 생각보다 신청경우, 예외처리 부분이 생각할 것이 조금 많았다. 스터디의 경우 공개 스터디와 비공개 스터디로 나뉘며 비공개 스터디일 경우 ‘참여코드’가 일치하면 가입신청이 가능했기에 생각할 부분이 많았다. 우선 StudyMemberStatus에서 상태를 나타내는 필드가 처음에는 활동중인/탈퇴한 스터디원만 확인할 수 있었기에 브랜치를 새로파서 StudyMemberStatus.java 이렇게 추가해 주었다. 추가된 필드는 STUDY_WAITING, STUDY_REFUSED 승인 대기중인 유저와, 승인 거부된 유저 필드이다. 스터디의 가입 진행 절차를 생각해보면 유저의 가입신청 → 승인 대기중 유저로 객체 생성 → 스터디장의 승인/거부 .. 2024. 5. 11. [깃터디/Todo] 스터디원의 Todo 완료여부 조회 api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡 스터디원의 Todo 완료여부를 조회하려면 일단 해당 스터디의 스터디원들을 조회해야하고 각각의 팀원들이 Todo에 대해 완료했는지 확인해볼 수 있어야했다.StudyTodoMapping 테이블과 StudyMember 테이블은 직접적인 연관관계 설정이 되어있지 않았다.그럼에도 조회가 가능한 방법이있다 🙀 ✨엔티티 간의 직접적인 연관관계가 없다고 해도 조회가 가능한 간접적 연관관계 ORM(Object-Relational Mapping)의 개념을 통해서 구현했다. // 스터디 active 멤버들 찾기 List activeMembers = studyMemberRepository.findActiveMembersByStudyInfoId(st.. 2024. 5. 11. [깃터디/Todo] Todo 삭제 api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡 회고 @Repositorypublic interface StudyTodoMappingRepository extends JpaRepository { List findByUserId(Long userId); Optional deleteByTodoId(Long todoId); List findByTodoId(Long todoId);}@Repository 는 스프링 프레임워크에서 제공하는 어노테이션으로 해당 클래스가 데이터 저장소, 즉 레포지토리의 역할을 수행한다. @Repository 어노테이션을 통해 스프링의 데이터 접근 계층에 속하는 컴포넌트임을 명시적으로 선언하고 스프링 컨테이너는 이를 통해 해당 클래스를 자동으로 검색하고 빈(bean)으.. 2024. 5. 11. [깃터디/Todo] Todo 수정 api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡 회고 // Todo 수정 @ApiResponse(responseCode = "200", description = "Todo 수정 성공") @PutMapping("/{studyInfoId}/todo/{todoId}") public JsonResult updateStudyTodo(@AuthenticationPrincipal User user, @PathVariable(name = "studyInfoId") Long studyInfoId, @PathVariable(name = "todoId") L.. 2024. 5. 11. [깃터디/Todo] Todo 조회 api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡 회고 비즈니스 로직을 구현할때 그에 맞는 컨트롤러, 서비스 구현도 중요하지만 테스트를 작성하는 과정이 중요하다고 느낀다. CRUD에서 R은 유저에게 보여줘야할 정보들이기 때문에 특히나 테스트가 더욱 중요하다고 느낀다. @Override public List findStudyTodoListByStudyInfoId(Long studyInfoId, Long cursorIdx, Long limit) { // Querydsl 쿼리 생성 JPAQuery query = queryFactory .select(Projections.constructor(StudyTodoResponse.class, .. 2024. 5. 11. [깃터디/Todo] Todo 등록 api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡 회고 @Repositorypublic interface StudyTodoRepository extends JpaRepository , StudyTodoRepositoryCustom{ Optional findByIdAndStudyInfoId(Long todoId, Long studyInfoId);}JpaRepository 인터페이스는 Spring Data JPA의 일부로, CRUD(Create, Read, Update, Delete) 작업을 위한 메서드를 제공해서 save(), findById() 등등을 쓸수있는것!!Optional findByIdAndStudyInfoId(Long todoId, Long studyInfoId); 특정 todoId와 s.. 2024. 5. 11. [깃터디/Auth] 닉네임 중복검사 api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡 회고 Entitiy 조회보단 -> Dto 조회가 성능상 유리QueryDsl에서 exist 메서드 쓰는것보다 JPA의 exists() 메서드를 사용했다. 그이유가 JPA exists()메서드는 선택된 항이 하나라도 존재하면 즉시 처리를 멈추고 결과를 반환하는데 QueryDsl exist 메서드는 실제로 count() > 0 으로 실행한다. // 참고한 자료 https://www.youtube.com/watch?v=zMAX7g6rO_Yhttps://yainii.tistory.com/36 @Test void 닉네임_중복체크_테스트_중복인경우() { // given userRepository.save(generateAuth.. 2024. 5. 10. 이전 1 2 3 4 5 6 7 ··· 14 다음