본문 바로가기

728x90
728x90

Framework/Spring

[Spring] Spring에서 요청 받는 법: @ModelAttribute vs @RequestParam - 컴도리돌이 API 요청을 받을 때 @ModelAttribute와 @RequestParam 어노테이션을 어떻게 사용해야 효과적인지, 각각의 차이점과 장단점을 비교해 보겠습니다. 이 두 어노테이션은 Spring에서 자주 사용되며, 요청 데이터를 받는 방식에서 중요한 역할을 합니다.@ModelAttribute@ModelAttribute는 객체 단위로 요청을 받을 때 유용합니다. 특히, 메인 페이지의 주요 리스트와 같이 여러 필드를 가진 요청을 받을 경우 유용하죠. 예를 들어, 클라이언트가 일부 필드를 빼먹거나 추가 필드를 보내더라도, @ModelAttribute는 기본적으로 없는 필드는 null로 처리하고, 불필요한 필드는 무시합니다.@GetMapping("list")public ResponseEntity getList.. 더보기
[Spring] 컨트롤러 단위 테스트: @WebMvcTest와 @SpringBootTest의 선택과 활용 -컴도리돌이 작심삼주 오블완 챌린지오늘 블로그 완료! 21일 동안 매일 블로그에 글 쓰고 글력을 키워보세요.www.tistory.com작업한 로직을 테스트하기 위해 컨트롤러에 단위 테스트 클래스를 작성하고, @WebMvcTest로 URL에 요청 테스트를 시도해 봤습니다. 하지만 예상보다 많은 난관이 있어 처음에는 쉽게 진행되지 않았습니다. 특히 여러 서비스와 유틸리티 클래스들을 어떻게 처리할지에 대해 고민이 많았네요. 🥲No qualifying bean of type available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} 위와 같은 에러가 발생하면서 테스트가 중단되었고, 이에 대한 해결책을.. 더보기
[Spring] 단위 테스트에서 @WithUserDetails 사용하기: 발생한 에러와 해결 방법 - 컴도리돌이 작심삼주 오블완 챌린지오늘 블로그 완료! 21일 동안 매일 블로그에 글 쓰고 글력을 키워보세요.www.tistory.com단위 테스트를 작성할 때, 로그인 인증이 필요한 API 요청을 테스트하는 과정에서 @WithUserDetails 어노테이션을 사용해 인증된 상태를 시뮬레이션하려고 했습니다. 처음에는 예상보다 많은 오류가 발생해서 이 문제들을 해결하기 위해 어떻게 접근했는지 기록해 보려고 합니다. 😅  [Spring] 로그인 필요한 API 단위 테스트 - 컴도리돌이작심삼주 오블완 챌린지오늘 블로그 완료! 21일 동안 매일 블로그에 글 쓰고 글력을 키워보세요.www.tistory.com이제는 숨을 쉬듯이 API 요청 로직을 만들지만, 단 한 번도 테스트 코드로 API 요청을 테comdolidol-i.t.. 더보기
[Spring] 로그인 필요한 API 단위 테스트 - 컴도리돌이 작심삼주 오블완 챌린지오늘 블로그 완료! 21일 동안 매일 블로그에 글 쓰고 글력을 키워보세요.www.tistory.com이제는 숨을 쉬듯이 API 요청 로직을 만들지만, 단 한 번도 테스트 코드로 API 요청을 테스트해 본 적이 없었던 것 같아요. 초반에는 단위 테스트 작성이 시간이 오래 걸리고, 주요 로직보다 더 많은 작업이 될 것 같아서 외면했었죠. 🥲 그런데 로직을 수정할 때마다 프로젝트를 재가동시키며 테스트를 하니 오히려 더 많은 시간이 소요되는 것을 느꼈습니다. 뿐만 아니라 예기치 못한 문제들이 발생하거나, 기존 기능에 새로운 기능을 추가하면서 어떤 영향을 미칠지 파악하기 어려워졌습니다. 이 경험을 통해 이제 단위 테스트는 선택이 아닌 필수라는 생각이 들었습니다.  그래서 이제부터 API 요.. 더보기
[Spring] @Cacheable에서 발생하는 self-invocation 문제 - 컴도리돌이 @Cacheable self-invocation (in effect, a method within the target object calling another method of the target object). The cache annotation will be ignored at runtime  @Cacheable 어노테이션을 사용해서 메서드 결과를 캐싱하려고 할 때, 같은 클래스 내의 다른 메서드를 호출하면 캐싱이 적용되지 않는 문제가 발생합니다. 저 역시 처음 이 문제를 겪고는 “왜 캐싱이 안 되지?”라는 의문을 가졌어요. 🤔 예를 들어, 아래처럼 getList 메서드에서 getTypeAList 메서드를 호출할 때 @Cacheable을 설정했는데도 캐시가 적용되지 않더라고요public SiteL.. 더보기
[Spring] @Caching을 활용한 유연한 캐시 관리 - 컴도리돌이 로직은 같지만 타입에 따라 캐싱 처리를 다르게 해야 할 때, 여러분은 어떻게 처리하시나요? 저의 경우, 메서드를 두 개 만들어 타입에 따라 명칭을 달리하고 각각 @Cacheable 어노테이션을 붙여서 사용했습니다. 이게 얼마나 레거시 중에 레거시인지 모르겠네요😂. 이번에 해당 영역을 다시 작업할 일이 생겨 이참에 두 메서드를 하나로 통합해 보려고 하다가, @Caching 어노테이션에 대해 알게 되었습니다. 제 상황에 딱 맞는 적절한 어노테이션이라 생각해서 바로 사용해 보았습니다.🙂 캐시 관리의 중요성이 커지면서, Spring 프레임워크의 @Caching 어노테이션은 복잡한 비즈니스 로직을 효과적으로 처리할 수 있는 강력한 도구입니다. 이번 블로그에서는 @Caching을 통해 다양한 조건에 따라 캐시를.. 더보기
[Spring] Elasticsearch에서 Query String을 활용해서 검색하기 (feat. Java) - 컴도리돌이 Elasticsearch에서 query_string은 사용자가 입력한 문자열을 기반으로 쿼리를 생성하는 아주 강력한 기능입니다. 이 방식은 복잡한 검색 조건을 간단하게 표현할 수 있도록 도와줍니다. 예를 들어, 사용자가 "apple"을 입력하면 "apple"과 관련된 모든 문서를 찾을 수 있는 거죠. 그렇다면 multi_match나 match와 같은 다른 쿼리와 비교했을 때, 왜 굳이 query_string을 사용해야 할까요? 🤔 우선, query_string은 검색어에 여러 조건을 한 번에 적용할 수 있는 유연함이 있어요. 사용자가 "apple AND banana OR orange"와 같은 복잡한 쿼리를 입력하면, 이를 해석해 다양한 조건을 적용할 수 있답니다. 반면, match나 multi_matc.. 더보기
[Spring] Elasticsearch에서 스크립팅 언어로 조건 필터링 구현하기(feat. Java) - 컴도리돌이 Elasticsearch에서 데이터 조회 시 특정 조건에 따라 필드 값을 조정하고, 오늘 날짜와 비교해 필터링하는 작업은 종종 필요한 기능입니다. 단순한 필터링 쿼리만으로는 표현하기 어렵거나 우아하지 못한 경우가 많은데요, 저 역시 필드 값의 유효성을 확인하고 이를 기준으로 조건을 처리하면서 우아하지 않은 쿼리식 때문에 고생했죠. 😅그러다 마침내 스크립팅 언어인 Painless를 사용해 원하는 조건을 충족할 수 있었습니다. 이번 포스팅에서는 스크립트 사용법과 함께 이러한 과정을 공유해 보겠습니다.Painless 스크립트 예제Elasticsearch에서 다양한 스크립트 옵션을 사용하는 예제를 살펴보겠습니다. inline, params, lang과 같은 다양한 옵션을 포함해 작성한 예제입니다. 특히, Pa.. 더보기