Spring8 클래스간 의존 강결합 해결하기 (1) - 스프링 이벤트 활용 클래스간 강결합 문제 회원가입 했을 때 환영 메세지를 보내는 비즈니스 로직을 개발하고자 한다. 보통 아래와 같이 개발하고자 할 것이다. class JoinService { void join() { // 회원 가입 로직... messageService.sendWelcomeMessage(message); } } 위처럼 코드를 작성할 때 무엇이 문제일까? JoinService와 MessageService가 강하게 결합하는 문제가 있다. 이런 강결합에는 다음과 같은 문제가 있다. 트랜잭션 문제이다. 도메인의 비관심사의 실패로 관심사에 영향을 미쳐서는 안 된다. 즉, 메세지를 보낼 때 실패해서 롤백되었어도 관심사는 롤백되어서는 안 된다. 반대로 관심사가 실패하면 비관심사도 같이 실패해야 한다. 즉, 회원가입이 실.. 2024. 1. 14. [Spring] Mapstruct 라이브러리 빌드 시 이슈 해결 Mapstruct 빌드 시 발생하는 문제회사 업무 파악을 하다가 서비스 코드를 빌드하는데 아래와 같은 문구가 IDE에 출력되었다. No implementation was created for ExampleMapstruct due to having a problem in the erroneous element java.util.ArrayList.error: No implementation was created for ExampleMapstruct due to having a problem in the erroneous element java.util.ArrayList. Hint: this often means that some other annotation processor was supposed to p.. 2024. 1. 11. TemplateInputException: Error resolving template [/common/fragments/footer], template might not exist or might not be accessible by any of the configured Template Resolvers 예외 해결 1. 문제상황 EC2로 서버를 구동했을 때 예외가 터졌습니다. 로컬에서는 문제 없었는데 말이죠. 그리고 이상하게 특정 url에만 접근하면 위와 같은 예외가 터졌습니다. org.thymeleaf.exceptions.TemplateInputException: Error resolving template [/common/fragments/footer], template might not exist or might not be accessible by any of the configured Template Resolvers (template: "user/home" - line 79, col 11) at org.thymeleaf.engine.TemplateManager.resolveTemplate(Template.. 2023. 8. 2. TemplateInputException: Error resolving template, template might not exist or might not be accessible by any of the configured Template Resolvers] 예외 해결 1. 문제상황 분명 로컬에서는 아무런 문제가 없었는데, EC2에 jar를 배포하자 사이트는 먹통이 되었습니다. 위와 같은 예외가 터졌습니다. @GetMapping("/find-id") public String findId(){ return "/login/find-id"; } 컨트롤러에서 뷰 탬플릿 이름을 리턴할 때 슬래쉬('/')를 포함해서 리턴했기 때문에 발생한 예외였습니다. IDE에서 돌릴 때는 상관 없지만, jar로 배포할 때는 문제가 된다고 합니다. 2023. 8. 2. Pageable을 활용해 타임리프로 페이징 처리 구현하기 1. 개요 포스팅에 앞서 이 포스팅은 페이징 처리에 관련해서만 내용을 담았습니다. 들어가기 앞서 용어를 정리해야 할 거 같은데요. 아마 페이징 처리를 한다는 건 위처럼 하는 것을 의미할 겁니다.(더미 데이터라 그러려니 하고 봐주세요) 페이지 그룹 : 페이지들을 모은 상위 카테고리 개념입니다. 페이지 그룹 사이즈만큼 페이지가 생길 것입니다. 위 이미지에서는 페이지 그룹 사이즈를 2로 설정했기 때문에 페이지는 두 개가 나옵니다. 페이지 : 페이지에는 정해둔 페이지 사이즈만큼 컨텐츠가 나올 겁니다. 게시판이면 게시글이, 쇼핑몰이면 상품들이 컨텐츠에 해당하겠습니다. 저는 e-book 서점이므로 도서의 정보가 컨텐츠로 나오는데 만약 페이지 사이즈를 5개로 설정했다면 페이지당 도서의 정보가 5개씩 나와야 합니다. .. 2023. 7. 20. 테스트 코드 작성 시 파일 업로드를 하지 않고 MultipartFile 가져오기 파일을 업로드하는 로직들을 모아 유틸 클래스로 만들고, 특정 서비스에서 파일 업로드 유틸 클래스를 참조하여 메소드를 호출할 때 해당 메소드를 테스트하려면 바로 다음과 같은 문제에 직면합니다. 테스트 코드에서는 파일 업로드를 할 수 없는데 유틸 클래스에서 MultipartFile 객체의 의존성이 있는 경우입니다. 이번 포스팅에서는 해당 내용을 다뤄보겠습니다. 1. 코드 코드를 보여드리기 전, 대충 코드의 로직을 설명해드리자면 도서를 등록할 때 thumbnail 이미지를 같이 등록해야 하는데 이때 파일 업로드 클래스를 호출하여 로직을 처리하고 있습니다. 도서 그룹 관리 컨트롤러 @RestController @RequiredArgsConstructor @Slf4j @RequestMapping("/manage/.. 2023. 7. 10. 이전 1 2 다음