@miiiinju 개발 블로그

@miiiinju 개발 블로그

  • 분류 전체보기
    • Computer Science
    • Backend
      • Spring
      • Spring Security
      • JPA
      • Redis
      • Docker
      • AWS
      • Java
    • PS
      • Baekjoon
      • Programmers
  • 홈
  • 태그
  • 방명록
RSS 피드
로그인
로그아웃 글쓰기 관리

@miiiinju 개발 블로그

컨텐츠 검색

태그

최근글

댓글

공지사항

아카이브

Backend/Spring(11)

  • @Async 메서드를 @Transactional 내에서 테스트하는 방법

    @Async로 실행하는 메서드에 대해 @Transactional 테스트를 수행하게 되면 문제가 발생합니다. (주석은 무시하셔도 좋습니다)위 메서드에 대해 테스트를 수행하기 위해 위와 같이 저장 후 테스트를 수행하여 검증하는 로직이 있는데,  값이 정상적으로 update되어 저장됐는지를 확인해야하지만, 분명히 동기적으로 작동시켰을 때는 정상적으로 동작했던 코드임에도 불구하고 @Async 옵션을 통해 수행하면 오류가 발생했습니다. 또한, 해당 메서드에서는 given에서 분명히 저장했던 Submit을 찾을 수 없다는 예외가 발생합니다. 이는 테스트 메서드에 달려있는 @Transactional로 인해, 현재 "Submit" 인스턴스를 저장한 트랜잭션이 커밋되지 않은 상태에서 다른 비동기 스레드가 해당 사항을 조..

    2024.06.07
  • [Spring Batch] 직접 AbstractPagingItemReader를 구현하여 도메인에 특화된 PagingCollectionsItemReader 만들어보기

    모두의 랜덤 디펜스에서는 '백준'의 문제 데이터를 이용하여 코딩테스트 문제를 제공합니다. '백준' 문제의 메타데이터는 시간이 갈수록 쌓일 것이고, 이를 자체 DB에 주기적으로 업데이트 하는 과정이 필요했습니다. 데이터베이스에 저장된 백준 문제들은 정기적으로 업데이트되어야 합니다. 이 목적을 달성하기 위해 solved.ac API를 활용하며, 이 API의 URL 구조는 다음과 같습니다.https://solved.ac/api/v3/search/problem?query={query}&page={page}특정 문제의 데이터를 조회할 때, {query}에 'id:1000'과 같은 문제 ID를 입력함으로써 접근할 수 있습니다. 문제 메타데이터 업데이트 과정 1. DB에서 문제 정보를 읽어온다.2. 문제 메타 데이터..

    2024.05.12
  • MockMvcBuilders.standaloneSetup()에서 LocalDateTime 직렬화 문제 해결 방법

    Meta: MockMvcBuilders, standaloneSetup, LocalDateTime, 직렬화, SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, Spring Boot, MockMvc, Jackson, ObjectMapper, 테스트 코드MockMvcBuilders.standaloneSetup()에서 LocalDateTime 직렬화 문제 해결 방법RestDocs를 사용하여 MockMvcBuilders.standaloneSetup()으로 구성된 테스트에서 LocalDateTime 직렬화 문제를 해결하는 방법을 소개합니다.The documented type of the field '{field Name}' is String but the actual type i..

    2024.05.01
  • ScheduledExecutorService를 통해 일정 시간 후 작업 수행되는 기능 만들기 (시험 시간 후 종료 상태로 변경하는 기능 만들기)

    모두의 랜덤 디펜스에서 제한 시간이 존재하는 시험 기능이 있습니다. 이전 프로젝트까지는 Client에서 직접 시험을 종료 시키는 API를 호출한 뒤, 백엔드에서 종료를 반영하는 역할을 수행했지만,  이 경우는 "사용자가 시험 도중에 강제 중단하는 경우" 를 완벽하게 해결할 수 없었습니다. 사용자가 중도에 시험을 강제 종료할 경우 client에서 시험 종료 API를 호출할 수 없었고, 시험 기록 일부가 몇 달이 지나도 IN_PROGRESS로 남아있는 현상이 발생했습니다. 따라서 이번에는 시험이 시작된 후 제한 시간이 지나면 종료시키는 로직을 추가하고자 했습니다.Spring에서 일정 시간 후 DB 필드를 종료시키기 아주 간단한 CompletableFuture아주 간단하게 생각할 수 있는 방법은 Complet..

    2024.04.29
  • ApplicationEventPublisher MockBean Injection 문제 해결 (@RecordApplicationEvents 활용)

    Meta: Spring Boot, ApplicationEventPublisher, MockBean, @RecordApplicationEvents, Spring Framework, Java, Backend, TestSpring Boot에서 특정 비즈니스 로직 실행 시 이벤트 발행을 검증하기 위해 ApplicationEventPublisher를 @MockBean으로 주입하여 테스트하려고 했습니다.특정 비즈니스 로직을 실행했을 때, 이벤트가 발행되는지 검증하기 위해 ApplicationEventPublisher를 @MockBean으로 주입하여 verify하고자 했습니다. 하지만 ApplicationEventPublisher를 MockBean 처리하여 SpringBootTest에 주입되게 의도하더라도Mock 객..

    2024.04.26
  • ScheduledThreadPoolExecutor가 작동하는 원리

    ScheduledThreadPoolExecutor가 작동하는 원리를 이해하기 위해 먼저 ThreadPoolExecutor의 동작을 이해해보겠습니다. ThreadPoolExecutor가 작동되는 원리Worker: ThreadPoolExecutor에 의해 관리되는 각 스레드 인스턴스.Worker의 run메소드가 실행되면 runWorker가 작동합니다.ThreadPoolExecutor의 runWorker() runWoker()가 동작되면현재 스레드를 가져오고, while 루프 내에서 Worker.getTask() 메서드를 통해 workQueue에 있는 task를 계속 가져와서 task.run()을 진행합니다.Worker의 getTask()getTask()에서 일시적으로 workQueue에 작업이 없으면 끝나는..

    2024.04.25
이전
1 2
다음
티스토리 깃허브

티스토리툴바