Project Trouble Shooting/[EATceed] 몸무게 증량 어플
-
Swagger 403 에러 해결Project Trouble Shooting/[EATceed] 몸무게 증량 어플 2024. 11. 12. 17:42
프로젝트를 진행 중에 Swagger API 에서 요청에 대한 응답으로 403 에러가 반환되고 있다는 것을 발견했습니다. 위 에러를 마주하였을 때 가장 먼저 의심한 것은 CORS 에러였습니다. 다만, 조금 더 고민해보니 앞뒤가 맞지 않는 추론이었습니다. 왜냐하면, Swagger의 Origin과 서버의 Origin은 동일한 Origin이기 때문입니다. Same Origin Policy 왜 동일한 Origin인데 CORS에러가 아니라고 생각했냐 라고 묻는다면 CORS 에러가 나온 이유를 생각해보면 당연합니다.웹 어플리케이션은 기본적으로 동일한 출처의 리소스만 공유할 수 있습니다.다만, 동일한 출처의 리소스만 공유할 수 있으면 웹 어플리케이션을 사용하는 데 너무 번거롭기 때문에 편의성을 위해 몇몇 출처를 허용해..
-
Cipher 클래스에서 암호화·복호화 지연 이슈 해결Project Trouble Shooting/[EATceed] 몸무게 증량 어플 2024. 9. 25. 00:04
EATceed 서비스에서는 사용자가 이메일 인증을 시도할 때 인증 코드를 사용합니다. 이 과정에서 보안을 위해 인증 코드를 암호화/복호화하고 있는데, 여기서 지연 문제가 발생했습니다. 암호화/복호화를 할 때마다 시간이 너무 오래 걸리고, CPU 부하가 크게 증가하는 것이었습니다. 문제를 분석한 결과, 원인은 Cipher 클래스를 사용하는 방식에 있었습니다. 본격적인 해결 방법을 설명하기 전에, 먼저 Cipher 클래스에 대해 간단히 소개하겠습니다. Cipher 클래스란? Cipher 클래스는 데이터를 암호화하거나 복호화하는 Java에서 제공하는 주요 클래스입니다. 이 클래스는 다양한 암호화 알고리즘과 작동 모드, 그리고 패딩 방식을 제공하여 다양한 보안 요구사항을 충족할 수 있도록 설계되었습니다. 하지만..
-
예외가 발생해도 이벤트 발행 후 처리하기Project Trouble Shooting/[EATceed] 몸무게 증량 어플 2024. 9. 11. 22:18
EATceed 프로젝트를 진행하며, 회원가입 API에 아래와 같은 요구사항이 추가되었습니다. 이메일 인증을 하지 않은 회원이 회원가입 하였을 경우에 "이메일 인증을 해주세요" 라는 응답과 함께 딥링크(with 인증코드)가 담긴 메일을 발송하라 이메인 인증 미완료시 이메일 재발송하기 EATceed에서는 이메일 인증을 완료하지 않은 사용자가 회원가입을 다시 시도할 경우, 이메일을 재전송하고, "이미 존재하는 이메일입니다. 이메일 인증을 해주세요"와 같은 응답을 반환해야합니다. 이메일 재전송 API를 만들 수도 있었지만 사용자 경험 저하 및 AOS 측 이메일 저장 문제로 인해 회원가입 API에서 "이메일 재전송"을 추가하기로 하였습니다. 이벤트를 사용해서 해결하기기존에 AlreadyEmailException..
-
DDD의 Entity와 JPA의 Entity를 구분해야하는 것인가?Project Trouble Shooting/[EATceed] 몸무게 증량 어플 2024. 8. 15. 17:11
DDD Entity와 JPA Entity 구분의 고민 EATceed 프로젝트에서는 JPA의 Entity와 도메인 주도 설계(DDD)의 Entity를 구분하여 코드를 작성하고 있습니다. 하지만, 몇몇 JPA 엔티티와 DDD 엔티티들이 구조적으로 거의 흡사하여, 이 둘을 구분하는 것이 옳은 선택인지 고민이 생겼습니다.제가 생각하는 장점과 단점은 아래와 같습니다.장점명확한 책임 분리DDD Entity는 비즈니스 로직과 도메인 모델링에 집중하고, JPA Entity는 데이터베이스와의 매핑에만 집중하게 되어 각 클래스의 책임이 명확해집니다. 이를 통해 코드를 더 이해하기 쉽고 유지보수하기 용이하게 만듭니다.도메인 모델의 순수성 유지DDD Entity는 데이터베이스에 의존하지 않고, 순수한 도메인 로직만을 포함하게..
-
N+1 문제 해결 및 인덱스를 활용한 쿼리 최적화Project Trouble Shooting/[EATceed] 몸무게 증량 어플 2024. 8. 12. 17:16
이번 포스팅에서는 EATceed를 개발하다가 발생한 N+1 문제를 Fetch Join으로 해결하고 이를 쿼리 분리를 통해 개선한 경험을 공유하고자 합니다.EATceed는 사용자의 식사를 바탕으로 체중 관리를 해주는 서비스로 주요 Entity로는 MemberEntity, MealEntity, FoodEntity가 있습니다. N+1 문제가 발생한 Entity들은 아래와 같습니다. MealEntity는 식사를 의미하는 Entity로 FoodEntity와 N : N 관계입니다. EATceed에서는 JPA를 사용하므로 가운데에 연결 테이블인 MealFoodEntity를 두었습니다.public class MealEntity { @Id @GeneratedValue(strategy = GenerationT..
-
헥사고날 아키텍처 회고 (2)Project Trouble Shooting/[EATceed] 몸무게 증량 어플 2024. 7. 28. 21:57
https://rasony.tistory.com/190 헥사고날 아키텍처 회고EATceed 프로젝트에서 헥사고날 아키텍처를 사용해보며, 고민해본 점을 서술해보려고 합니다.먼저, 헥사고날 아키텍처를 도입한 이유입니다. 헥사고날 아키텍처를 도입한 이유 계층형 아키텍처rasony.tistory.com 프로젝트를 진행하며, 외부 서비스를 이용해야하는 기능들이 점점 더 생기기 시작하였습니다. 구체적으로, AWS의 S3와 SES 서비스를 이용하고, 데이터베이스로는 MariaDB와 Redis를 사용하게 되었습니다.또한, 특정한 트리거로 인한 스케줄링 기능을 사용하기 위해 Quatz를 도입하였습니다. 이에 아래와 같은 패키지가 추가되었습니다. 현재 패키지 구조는 도메인기반으로 패키지 구조를 나누고 있었습니다.하지만,..
-
ApplicationContext Caching을 활용한 테스트 환경 개선Project Trouble Shooting/[EATceed] 몸무게 증량 어플 2024. 7. 23. 20:34
배경프로젝트가 진행되면서 Jacoco를 도입해 테스트 커버리지를 측정하고, 처참한 커버리지를 보여줌으로써 팀원들(저 포함..)이 테스트를 작성하도록 독려했습니다. 이를 통해 테스트 코드의 수가 점차적으로 늘어나고 있었습니다. 또한, 테스트 컨테이너를 활용하여 테스트 환경을 구축하는 데 힘을 쏟았습니다. 어느덧, 테스트의 수가 70개가 넘어갈 때쯤 Run All Tests할 때 걸리는 시간이 꽤나 늘어나 있었습니다. ApplicationContext Caching 스프링에서는 테스트에 사용되는 애플리케이션 컨텍스트를 생성하고 관리하여 테스트에 적용해주는 테스트 프레임워크를 제공합니다. 테스트 컨텍스트 프레임워크는 테스트가 사용하는 컨텍스트를 캐싱해서 여러 테스트가 컨텍스트를 공유하는 방법을 제공합니다.하..
-
팩토리 메서드 패턴을 사용하여 도메인 리팩토링하기Project Trouble Shooting/[EATceed] 몸무게 증량 어플 2024. 7. 13. 16:22
프로젝트를 진행하며 아래의 도메인 클래스가 너무 많은 기능을 가지고 있어 리팩토링할 필요가 있다고 생각했습니다.public class Nutritionist { private DailyMeal dailyMeal; private Member member; public boolean evaluateProteinAchieve() { return member.measureTargetProtein() - getCurrentProtein() 위의 Nutritionist 즉 영양사 도메인은 단백질, 탄수화물, 지방, 칼로리 달성률을 계산하는 책임과 영양사 도메인을 생성하는 책임을 가지고 있습니다.하나의 도메인이 너무 많은 책임을 가지고 있다고 생각하여 책임을 분리하기로 하였습니다. - ..