Project 8

[Project] TDD 개발 시 given의 코드 양 줄이기 (Fixture, Persister) + @spy 활용

서론:IT연합동아리 DND에서 진행한 프로젝트를 하며 느낀 점입니다. TDD로 개발을 진행하게 되면서 메인 코드 뿐만 아니라 테스트 코드도 코드임을 느꼈습니다. 어떻게하면 테스트 코드의 양을 줄일 수 있고, 테스트를 편하게 작성할 수 있는지에 대한 고민이 담겨있습니다. 본론으로 들어가기 전에 저의 프로젝트는 Controller, Service, Repository 모든 계층의 테스트가 given-when-then 패턴을 사용하는 단위테스트로 이루어져있음을 알립니다! Fixture처음에는 given에 머릿속으로 흘러가는 로직을 모두 다 넣으면서 개발을 했었습니다. 하지만 연관 관계가 많은 엔티티를 마주하자 제가 사용하던 로직은 좋은 코드가 아님을 깨달았습니다. 제가 쓴 코드들을 쓱 보다가 문뜩 "모든 계층..

Project 2024.06.08

[Project] 실시간 채팅 구현 시 FCM Token 발송 여부 결정하기

서론 tincle 앱 1:1 대화 기능을 개발 중, 대화방에 모두 들어와있을 경우에 메세지 전송을 하게 된다면 FCM Token을 발송하지 않고, 한 명만 들어와있을 경우에는 FCM Token을 발송하는 로직을 구현해야 했습니다. 프론트 쪽에서 대화방에 들어와 있을 경우 인앱 알림을 끄는 방안도 있었으나, 백엔드에서 처리하는 방법이 없을까? 고민을 하다가 이 방안이 괜찮은 것 같아서 백엔드에서 처리하기로 했습니다. socket, stomp 사전 설정 WebSocketConfig @Configuration @EnableWebSocketMessageBroker @RequiredArgsConstructor public class WebSocketConfig implements WebSocketMessageBr..

Project 2024.03.25

[Project] Spring + Stomp 테스트 하는 과정.. (실시간 채팅 구현)

서론 tincle이라는 친구 기반 SNS 서비스를 개발하는 도중, 1:1 채팅 즉 DM같은 기능을 개발하게 되었습니다. 그 과정에서 소켓과 Stomp를 도입하게 되어서 테스트를 하려고 알아보던 중.... 난관에 대해 소개하려합니다. 해당 글은 소켓이 무엇인지, Stomp가 무엇인지가 아닌 테스트하는 방법에 대해 서술합니다.  테스트 과정 전 필자의 설정 저의 webSocket 설정은 다음과 같습니다. WebConfig@Configuration@EnableWebSocketMessageBroker@RequiredArgsConstructorpublic class WebSocketConfig implements WebSocketMessageBrokerConfigurer { private final Stom..

Project 2024.02.27

[Project] 멀티 모듈을 왜 쓸까? (멀티 모듈 도입 전)

서론 IT 연합동아리 DND에 참가하게 되어서 새로운 사이드 프로젝트를 진행하게 되었습니다. 백엔드는 2명으로 이루어져 있는데, 소통을 하다보니 자연스럽게 이번 프로젝트에 대해 고민하게 되었습니다. 이번 프로젝트로 얻어가는 것으로 두가지 주제가 있었는데 하나는 멀티 모듈, 나머지 하나는 TDD 였습니다 ! 이번 글에서는 멀티 모듈에 대해 얘기해 보려고 합니다. 모듈은 무엇인가? Oracle Java 문서에서 모듈이란 패키지의 한단계 위의 집합체이며, 관련된 패키지와 리소스의 재사용할 수 있는 그룹이라고 정의하고 있습니다. 이때 각 모듈은 독립적으로 개발, 빌드, 테스트, 배포가 가능합니다. 멀티 모듈 멀티 모듈 프로젝트는 상호 연결된 여러 개의 모듈로 구성된 프로젝트를 의미합니다. 즉 멀티 모듈 단일 프..

Project 2024.01.15

[Project] google Oauth2 로그인 시 refreshToken을 받는 방법 (최초 로그인에서 저장을 못했을 때)

서론 tincle이라는 프로젝트를 진행 중에 일어난 일입니다. 1차 MVP에서는 google과 kakao의 회원가입 기능만 개발하기로 해서 회원가입 기능만 개발했었습니다. 1차를 완료한 후 2차 개발이 시작되었는데, 2차에서 플레이스토어 배포를 위해 회원 탈퇴기능을 구현해야 했습니다. 그 과정에서 최초 google 로그인에서 refreshToken을 저장하지 못했을 때 다시 발급 받는 과정에 어려움이 있어 다른 누군가에게 도움이 되기 위해 이 글을 적습니다. google 로그인과 회원 탈퇴 로직 보기(Java/Spring) -> https://github.com/DoDream-dev/Tinqle-Server/blob/develop/src/main/java/tinqle/tinqleServer/domain/..

Project 2023.11.29

[Project] Redis(Elasticache Redis)로 RefreshToken을 관리하기

서론 팅클(Tincle)이라는 프로젝트에서 JWT를 통해 프론트와 소통을 했는데, 이 프로젝트는 친구기반 SNS 서비스입니다. 만약 사용하게 된다면 한번 접속할 때 '짧은 시간이 아닌 긴 시간동안 머무르지 않을까?' 판단했습니다. 때문에 토큰 재발급하는 횟수가 많다고 생각했습니다. 그에 따른 시간 비용을 줄이고자 Redis로 RefreshToken을 관리한 경험을 얘기하려 합니다. 데이터베이스가 있는데 왜 Redis를 사용할까? Redis는 인메모리 캐시로 메모리에서 데이터를 처리합니다. Client가 필요로 하는 정보가 만약 DB에 존재하게 된다면 Disk 영역까지 가야하기 때문에 시간이 오래 걸리게 됩니다. 반면 Redis에 정보가 존재하게 된다면 Memory 영역에서 처리 후, 값을 반환하게 되어 ..

Project 2023.11.25

Apache JMeter란? + 부하 테스트, 사용법

Apache Jmeter를 접하게 된 이유 4개월 정도 진행해오던 복쟉복쟉이라는 프로젝트가 이제 배포를 앞두고 있다. 배포를 앞두기 전에 성능 저하 (ex. JPA N+1문제를 일으키는 것들, 현재 EC2가 어느정도까지 수용가능한지) 를 체크하기 위해서 접하게 되었다. 제대로 체크해보기전 Apache Jmeter의 설치 과정과 사용법을 알아보려고 한다. Apache Jmeter Apache Jmeter는 서버가 제공하는 성능 및 부하를 측정할 수 있는 테스트 도구이다. JMeter는 순수 Java 애플리케이션 오픈 소스이며 서버나 네트워크 또는 개체에 대해 과부하를 시뮬레이션하여 강도를 테스트하거나 다양한 부하 유형에서 전체 성능을 분석하는 데 사용할 수 있다. 비슷한 부하테스트 도구로는 Apache B..

Project 2023.08.22

[Project] @Transactional + CustomException을 Controll하자

Project 하던 중, 정상적인 값이 조회되는데 DB값은 안바뀌는 상황이 있었다. 그에 대해 이야기 해보려고 한다. 전제 안드로이드 측에서 kakao accessToken을 주면 DB에 kakaoUser가 이미 존재 -> 바로 서버 accessToken 및 refreshToken 발급 (httpstatus 200 내려줌) DB에 kakaoUser가 존재 x 즉 첫 방문 User -> signToken을 발급해서 닉네임, 이메일 등 부가 정보를 입력하는 화면으로 이동 후, 앞서 발급한 signToken + 부가 정보를 받아서 회원 가입 (httpstatus 404 내려줌 -> 즉 exception 터트림) + 추가적으로 만약 회원 탈퇴를 할 시, 중복 가입 방지를 위해 탈퇴한 회원은 한달 동안 가입을 못..

Project 2023.08.08