본문 바로가기

전체 글

모니터링툴 도입 모니터링 툴 도입 이유결론부터 말하면 구현 복잡도를 적정 수준으로 조절하기 위해서 도입했다. 현재 제작하고 있는 앱은 MVP 제작을 마치고 QA 단계에 들어섰다.MVP 제작을 하면서 느낀점은 "굳이 이렇게 복잡하게 만들어야 하나?"에 대한 의문이었다.가끔식 보면 기획자가 굉장히 디테일하게 기능 설계를 하는 경우가 있었다.예를 들어, MVP 앱에서는 알람의 종류를 푸시 알람, 공지 알람, 실시간 알람. 3개로 정의한다. 여기서 기능 중 몇 개가 3개 알람을 동시에 사용자에게 전달한다.본인은 과하다고 느낄 때가 있지만, 기획자의 기능 설계에 반박하기는 어려웠다.근본적으로 사용자가 써보질 않았으니 무엇이 옳은 선택인지 판별할 수 없었기 때문이다. 그렇기 때문에 모니터링 툴의 도입이 필요하다고 느꼈다.만일, .. 더보기
Dockerfile 설정 업데이트 문제 상황- CI/CD 배포 도중 Dockerfile에서 에러 발생Run docker build . --file Dockerfile --tag fitview-be:latest#0 building with "default" instance using docker driver#1 [internal] load build definition from Dockerfile#1 transferring dockerfile: 337B done#1 DONE 0.0s#2 [auth] library/openjdk:pull token for registry-1.docker.io#2 DONE 0.0s#3 [internal] load metadata for docker.io/library/openjdk:17-jdk-slim#3 E.. 더보기
클린 코드 적용 (해당 글에서 나타난 코드는 전부 공개를 허가받은 코드입니다) 결제 구현을 담당하게 됐다.기능을 빠르게 만들어야 하는 상황이었다.그러다 보니 완성 이후에 코드는 엉망에 가까웠고, 본인조차 해석이 어려웠다.이에 따라 클린 코드에 대한 공부를 하게되면서 점진적인 리팩토링을 하게 됐다. 1. before처음 제작한 함수다.해당 코드는 DB 주문 금액 - 부트페이 결제 금액을 체크한 후 일치하면 결제 승인을 내린다.임시로 주석만 남겨두고, 기능 구현을 빠르게 마쳤다.@Transactionalpublic Boolean savePayment(Integer accountId, PaymentRequestDTO requestDTO) { // 필요 정보 호출 Account findAccount = accountSe.. 더보기
순환참조 - ApplicationService ChallengeParticipant → Challenge → ChallengeParticipation → ChallengeParticipant → … 주요 문제점설명ChallengeParticipantService에서 accountId, challengeId로 각 Account, Challenge 엔티티를 호출한다.ChallengeParticipant에 Account, Challenge를 넣고 저장한다.⇒ ChallengeService에서 ChallengeParticipant를 호출하여 챌린지 참여 여부까지 확인하게 되면 서로 순환참조에 빠진다.@Transactionalpublic Boolean saveChallengeParticipant(**Integer accountId, Integer challe.. 더보기
이미지 전송 1. 요약목적이미지 전송 원리 이해동기현재 제작하고 있는 프로젝트의 더 깊은 이해현 프로젝트에서는 이미지를 GCS에 저장하여 사용하고 있음해당 이미지 전송에 대한 이해도가 부족하다고 생각되어, 이미지 전송 과정을 공부하고자 함과정FE → BE로 이미지 전송하는 과정을 그리기2. FE요약통신 방법XMLXHLXMLHttpRequestAJAX데이터 형식MIME-TYPEContent-Typemultipart/*multipart/form-dataXML데이터 표기 방법 중 하나데이터 전송 시, xml 형식으로 데이터 정보 기술 가능예시 Harry Potter J.K. Rowling 1997  XHL비동기 통신 방법XML, JSON 등의 데이터를 주고받게 됨이점페이지 새로고침 없이 최신 정보로 업데이트※ 동기 / 비.. 더보기
테스트 코드 https://tech.kakaopay.com/post/mock-test-code/1. 요약테스트 코드는 Mock을 스프링 빈으로 등록하여 사용한다.각 의존하는 객체는 실제 사용하는 것이 아닌, return 값을 미리 정해준다.2. 문제테스트 코드 작성 시, 의존하는 객체에 의해서 문제가 발생한다.아래 코드는 AuthService의 login 함수를 테스트하는 코드다.문제는 login 함수를 테스트 하기 위해서 DB에 데이터를 저장해야 한다.즉, AuthService는 UserRepository(DB 저장 객체)에 의존적이다.이와 같은 의존 객체가 많아질 수록, 테스트가 어려워진다.@SpringBootTestclass AuthServiceTest { private final AuthService a.. 더보기
스프링 - GCS 이미지 저장/덮어쓰기/삭제 목적GCS로 이미지 저장, 삭제, 수정 구현설명GCS는 Storage 객체를 통해 이미지 저장소(bucket)에 접근 가능Storage를 통해 이미지 저장 및 삭제 가능(수정은 불가)보완 계획GCS 이미지 등록을 비동기적으로 수행Storage 객체를 비동기적 또는 멀티 스레드 방식으로 해결 예정(현재는 ADMIN 관리자만 상품 등록이 가능하므로, GCS를 스프링 빈으로 선언해서 싱글톤 객체로 쓰고 있음) QnA)1. GCS 용어용어https://techblog-history-younghunjo1.tistory.com/27Bucket데이터 저장소Bucket안에 Bucket이 있을 수 없음각 Bucket 안에 각 데이터(이미지)를 저장 가능ObjectBucket 안에 있는 각 데이터구성 요소객체 데이터실제 .. 더보기
JWT_사용자 정의 로그인 목적JWT 로그인 인증을 REST API 형식으로 구축한다.과정프론트 : 로그인 요청백엔드 : 로그인 인증 및 JWT 쿠키 전달프론트 : 각 요청 헤더에 JWT를 담아서 백엔드에게 API 요청(전달받은 JWT 쿠키는 자동으로 클라이언트에 저장됨)백엔드 : JwtFilter를 통해 요청 헤더의 JWT를 검증. 그 후, 인증된 사용자에게는 API 제공 1. SecurityConfig스프링 시큐리티각 요청에 필터를 적용 할 수 있음(검증된 요청자에게만 API 제공)목적각 API 요청마다 JwtAuthenticationFilter를 적용 시키는 것(JwtAuthenticationFilter는 요청 헤더에 있는 JWT 토큰을 검증함)@Configuration@EnableWebSecuritypublic class .. 더보기