본문 바로가기

spring6

멀티 모듈을 설정하며 겪었던 예외들...(feat. Gradle, Springboot) 들어가며 1월 2일 첫 회사에 입사하고 저는 처음 접하는 스택들에 둘러쌓이게 되었습니다. 그렇게 처음 접하게 된 개념 중 하나가 바로 멀티 모듈이었습니다. 사실 MSA에 대해서 학습할 때 키워드로만 접해봤습니다만, 본격적으로 이를 학습하고 구축해보는 것은 처음이었는데요. 이 과정에서 알게된 것들과 겪었던 오류 사례들을 정리해보는 것이 이 글의 목적입니다. 멀티모듈이 무엇인가? 모놀리식 Monolithic, 마이크로 서비스 MicroService Archtecture 그리고 멀티모듈..? 처음 개념을 접하며 가장 먼저 들었던 질문은 "MSA와 멀티모듈이 무슨 차이점이 있고 왜 같이 많이 언급되는가?" 하는 것이었는데요. 그래서 먼저 이 질문에 대한 답변을 짚고 넘어가려고합니다. 결론적으로 모놀리식과 마이.. 2024. 1. 13.
`Postman` 으로 WebSocket STOMP 테스트 해보기 들어가며 최근 Secondhand 프로젝트를 정리하며 그동안의 학습을 돌아보고 디버깅과 성능개선을 하고 있습니다. 그러다보니 거의 반년동안 계속 유지보수하고 있는 프로젝트가 되어서 이정도면 반려 프로젝트(...)라고 할 수 있을 정도로 애증이 담긴 프로젝트가 되어버렸는데요. web site 웹소켓 통신을 구현했지만, STOMP 프로토콜을 테스트 하기 쉽지 않아서 난항을 겪었던 때가 있었습니다. 평소에는 `Postman`이나 간단한 API라면`curl`로 테스트를 하는데 Postman에서 `STOMP`를 지원하지 않았거든요. 그래서 인터넷을 찾다가 `APIC`이라는 api테스트 툴을 애용하고 있었습니다. 근데 언제부턴가 이 사이트에 접속할 수 없게 되었어요 🥲 https://docs.apic.app/ Ab.. 2023. 12. 30.
S3 업로드를 비동기로 처리하고 싶어요✊ : 반환이 있는 @Async를 사용할 때 주의할 것들.... 이 글은 Secondhand 프로젝트를 하며 트러블 슈팅하고 학습한 내용을 정리한 글입니다. 시작하며 Secondhand에 글을 작성할 때는 최대 10장의 이미지를 업로드할 수 있습니다. 이 기능을 구현하고 나서 가장 마음에 걸렸던 부분이 있는데요, 바로 이 10장의 이미지가 하나의 스레드에서 동기적으로 처리된다는 것입니다. 꽤 고화질인 이미지를 10장 한번에 처리를 하면 3초정도 소요되기도 합니다 👀.... 계속 마음에 걸렸던 코드라 이참에 리팩토링을 해보기로 했습니다. 개선 해보자 기존 로직 및 문제점 분석 원래 코드와 시퀀스 다이어그램을 먼저 공유하자면 다음과 같습니다. @Override public List uploadItemDetailImages(List request) throws ImageH.. 2023. 11. 6.
🔐 비밀번호 암호화해보자 (Feat: Spring) 해당 글에서 구현 언급한 코드는 practice-member-api 에서 확인 가능합니다. 시작하며 초반 연습용 프로젝트에서 회원가입을 구현하며 그냥 일반 텍스트로 회원 비밀번호를 관리해왔습니다. 하지만 보안상 비밀번호를 이렇게 평문으로 저장하는 일은 반드시 지양되어야 합니다. 마침 회원가입과 Jwt 토큰을 사용하는 인증/인가는 매우 자주 쓰는 로직이라 나만의 라이브러리를 만들고 싶었는데요. 원티드 프리온보딩 백엔드 미션이 딱 기본 회원가입 + jwt 토큰 방식의 인증인가 + 게시판 REST API라서 이참에 이 비밀번호 암호화를 구현해보기로 했습니다💪 Spring Framework 는 Spring Security 라는 하위 프레임워크에서 이러한 보안 인증인가 를 편리하게 제공해주고 있지만 해당 암호화 .. 2023. 10. 29.
`@Cachable` 사용시 SpelEvaluationException 발생 발생 상황 Spring data Redis 의존성 주입 후, @Cachable 적용하여 테스트하다가 다음의 에러를 만났습니다. 2023-09-18 10:44:26.783 ERROR 7339 --- [nio-8080-exec-4] c.t.secondhand.global.dto.ErrorResponse : EL1030E: The operator 'SUBTRACT' is not supported between objects of type 'java.lang.Long' and 'null' org.springframework.expression.spel.SpelEvaluationException: EL1030E: The operator 'SUBTRACT' is not supported between objects.. 2023. 9. 18.
Spring Event를 사용하여 도메인간 의존성 낮추기 이 글은 당근마켓을 모티브로 한 프로젝트 Secondhand 구현시 이슈 사항을 정리한 글입니다. 상황 Secondhand에는 실시간 채팅 어플리케이션이 있습니다. 웹소켓 통신을 기반으로 하며 STOMP와 Redis pub/sub 으로 구현하였는데요. 이 채팅에 대한 요구사항 중에 다른 도메인의 서비스를 참조하는 경우가 많아져 Facade가 비대해지고 각 도메인의 서비스 로직이 복잡하게 구성이 되며 의존성이 높아지는 우려가 생겼습니다. @Component @RequiredArgsConstructor public class ChatroomFacade { private final ChatroomService chatRoomService; private final ItemService itemService; .. 2023. 9. 13.