Project/깃터디 (gitudy)24 [깃터디/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. [깃터디/Auth] 회원 정보 조회 구현 💡 .java를 클릭시 관련 커밋으로 이동💡 /auth/info@AuthenticationPrincipal 사용하여 인증된 사용자의 정보 → 역할 확인(UNAUNTH 면 예외 처리)→ platformId + platformType 으로 DB에 저장된 값 조회 → 없으면 예외처리 → 사용자 정보 조회 AuthController.java@ApiResponse(responseCode = "200", description = "회원 정보 조회 성공", content = @Content(schema = @Schema(implementation = UserInfoResponse.class)))@GetMapping("/info") public JsonResult userInfo(@Authentication.. 2024. 5. 10. [깃터디/Auth] 로그아웃 요청 구현 💡 .java를 클릭시 관련 커밋으로 이동💡 AuthController.javaprivate final static int REFRESH_TOKEN_INDEX = 2;@ApiResponse(responseCode = "200", description = "로그아웃 성공")@PostMapping("/logout") public JsonResult logout(@RequestHeader(name = "Authorization") String token) { List tokens = Arrays.asList(token.split(" ")); if (tokens.size() == 3) { authService.logout(tokens.get(REFRESH.. 2024. 5. 10. 이전 1 2 3 다음