[스파르타코딩클럽]/TIL 60

[240104] 심화 프로젝트 마무리 :: 트러블 슈팅

심화 프로젝트 발표를 준비하면서 팀원들이 경험한 트러블 슈팅에 대해서 정리해보고자 한다. 카테고리 및 카드 정렬 문제 칸반보드 협업 툴인 Trello와 비슷한 칸반보드 서비스를 구현하는 프로젝트이기 때문에 카드와 카테고리를 드래그해서 움직이면 해당 카드와 카테고리의 순서가 바뀌게 된다. 이를 구현하는 과정에서 어떤 방법을 사용하는 것이 좋은지에 대한 문제에 부딪히게 되었다. 제안된 방식들 컬럼 테이블의 필드로 json으로 카드 순서를 저장 ex) [1,2,3,4,5] -> [1,2,4,3,5] 카드 테이블의 필드로 전, 후의 카드id를 저장 - 최대 4번 요청 순서 테이블을 만들어서 이용 (1, 2번을 혼합) 변경 전후의 seq 값을 더해서 2로 나눔 일주일이라는 주어진 시간 안에 구현해야 하는 기능이 ..

[240103] 심화 주차 KPT회고

Keep (계속 이어갔으면 하는 부분) infra 활용해서 하고 싶은 것들 다 해볼 수 있었음 팀원들의 적극적인 참여, 코드 리뷰를 통해 완성도 높은 프로젝트가 나올 수 있었음 컨벤션을 설정하고 지킴으로써 통일성 있는 코드를 작성함 Issue와 PR을 적극적으로 활용함 CI/CD 환경을 구축함으로써 여러 팀원이 개발에 참여했음에도 충돌의 문제 등 불필요한 시간을 보내지 않음 팀원 모두가 Rivew를 작성함으로써 코드 개선에 도움이 됌 컨벤션을 미리 잡고 프로젝트를 시작한 점. 그리고 이를 sample 디렉토리로 프로젝트 시작때 만들어 둔 것. 단순히 문서화 이상으로 어떻게 코드를 작성해야하는지 바로 확인하며 작성할 수 있어서 아주 좋았음 스타일 가이드를 미리 적용해놓고 시작한 점. Google style..

[240103] 심화 프로젝트 마무리 :: 컨벤션

지금까지 해왔던 프로젝트들 중에서 가장 알차면서도 힘들었던 심화 프로젝트를 마무리하면서 프로젝트 동안 배운 것들을 조금씩 정리해보려고 한다. 구현 기능, ERD, API 명세, 기술 스택 등은 깃허브 레포지토리의 readme에서 확인할 수 있다. 깃헙 주소: https://github.com/yejin-kingdom/value-together GitHub - yejin-kingdom/value-together: 가치 있는일을 같이 진행하자! 일정 공유 어플리케이션! 가치 있는일을 같이 진행하자! 일정 공유 어플리케이션! . Contribute to yejin-kingdom/value-together development by creating an account on GitHub. github.com 컨벤..

[231228] service 테스트에서의 MultipartFile

프로필 수정 API를 구현한 뒤 서비스단의 테스트 코드를 작성하는 과정에서 매개변수로 MultipartFile 타입을 받아야 했다. MultipartFile 타입의 매개변수를 가지고 테스트 코드를 작성하는 것이 처음이었기 때문에 이번 기회에 정리해두려고 한다. 테스트 대상: Service의 updateProfile() @Override public UserUpdateProfileRes updateProfile(UserUpdateProfileReq req, MultipartFile multipartFile) { UserValidator.validate(req); User savedUser = getUser(req.getUserId()); String imageUrl = savedUser.getProfile..

[231227] 이메일 인증 구현 (링크 방식)

이번 팀 과제에서는 회원가입, 프로필, 댓글 기능을 담당하게 되었다. 지금까지 과제에서 회원가입 시 이메일 인증 기능을 구현해본 적이 없었기 때문에 이번 기회에 공부해보고자 하였다. 처음에는 네이버 SMTP를 이용하였다가 application.yml에 계정 비밀번호가 노출되는 문제가 있어 앱 비밀번호를 사용하는 Gmail SMTP로 변경하였다. 이메일 인증 과정 이메일 인증에는 대표적으로 사용자가 입력한 이메일 주소로 인증 코드를 전송하여 해당 코드를 입력받는 방식과 이메일의 링크를 클릭하면 이메일 인증이 완료되는 방식이 있다. 이번에는 링크 방식으로 구현해보았다. 인증 과정는 다음과 같다. sendEmail API에 email을 담아서 요청을 보낸다. 사용자가 입력한 주소로 이메일을 전송한다. 이때 이..

[231221] update 시 Timestamp 값으로 null이 반환

문제 상황 게시글을 수정하는 API를 구현하는 과정에서 기존의 방식과 달리 repository.save() 매서드를 사용하여 update한 내용을 반영하고자 하였다. 이때 createdAt과 modifiedAt 필드의 값이 null로 반환되었다. PostServiceImpl 기존 코드 :: updatePost() @Override @Transactional public PostUpdateRes updatePost(Long postId, PostUpdateReq req, User user) { Post post = postReadService.getPostEntity(postId); PostValidator.checkPostAuthor(post, user); Post savedPost = postRepos..

[231219] QueryDSL, JPQL

Spring 3.X 버전 연동 설정 dependencies { .... // 9. QueryDSL 적용을 위한 의존성 (SpringBoot3.0 부터는 jakarta 사용해야함) implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persisten..

[231218] 이진트리, 힙

이진 트리 (Binary Tree) 이진 트리의 종류에 대해서 확실히 모른다는 생각이 들어서 정리해보았다. 트리(tree): 노드와 엣지로 이루어진 비선형 계층적 자료구조 이진 트리의 종류 1. 이진 트리: 모든 노드들이 두 개 이하의 자식을 가진 트리 2. 이진 탐색 트리 (Binary Search Tree, BST): 왼쪽 자식은 부모보다 작고 오른쪽 자식은 부모보다 큰 이진 트리 삽입, 삭제, 탐색의 시간복잡도: 평균 O(logN), 최악 O(N) 순회 종류 전위 순회: root -> left child -> right child 중위 순회: left child -> root -> right child 후위 순회: left child -> right child -> root 3. 정 이진 트리 (f..

[231213] MySQL 공부

동명 동물 수 찾기 https://school.programmers.co.kr/learn/courses/30/lessons/59041 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 동물의 중복되는 이름과 그 개수를찾는 문제이다. 중복되는 이름의 개수를 어떻게 세면 좋을지 몰라 처음에 어렵게 느껴졌다. Order by로 이름으로 그룹화해서 각 그룸 내에서 count를 이용해줌으로써 해결할 수 있다. 코드 SELECT NAME, COUNT(NAME) AS COUNT FROM ANIMAL_INS GROUP BY NAME HAVING COUNT(NAME) > 1..

[231211] Spring 심화 개인 과제 피드백

이번 심화 개인 과제로 테스트 코드를 작성하는 과제가 나왔다. 테스트 과제를 진행하면서 궁금했던 점들을 깃허브 이슈에 남겨놓았고, 이를 토대로 튜터님께서 답변을 남겨주셨다. 1. 테스트 시 기존 코드에 없는 생성자가 필요한 경우 예를 들어 reqeustDto 같은 경우 테스트를 위해서 값을 넣어줘야 했는데, 기존의 코드에서는 Getter만 있었기 때문에 생성자를 추가해주었다. 테스트로 인해서 기존 코드의 변경이 있는 것은 좋지 않다는 생각이 들어서 이에 대해 질문을 남겼다. 답변: 이런 경우 생성자는 NoArgsConstructor의 AccessLevel을 PROTECTED로 정의하고 mockBuilder를 사용해서 명확하게 객체를 만들 때 mockBuilder를 사용하는 방법이 있습니다. // ex. ..