-
우아한 테크캠프 7기 합격 + 2주차 후기
우아한 테크캠프 7기(백엔드)에 합격했던 과정과 2주 동안 참여한 후기를 작성해보려고 합니다. 우아한 테크 캠프에 참여하기 까지코딩 테스트알고리즘 3문제 + CS 객관식 5문제를 프로그래머스에서 진행했습니다.코딩 테스트 언어가 Java로 제한되어 있어 알고리즘 난이도가 어렵지 않을 거라고 생각했었고, 실제로도 그랬던 기억이 납니다.1번 2번이 하여 푸는데는 25분 안으로 끝냈던 것 같고, 3번이 어려운 건 아닌데 처음 보는 아이디어가 필요했던 이분 탐색 문제라 구현을 헤맸습니다. 이후 반례를 찾으려 테스트 케이스 돌려보다 2번에서 특이한 반례를 찾아 그 부분을 고쳐서 제출했습니다.CS 객관식 문제는 크게 어렵지 않아서 쉽게 맞췄던 거 같습니다. 하지만 CS 객관식 문제가 추론을 요하는 문제라기 보다는 해..
2024.07.07 23:00 -
@Async 메서드를 @Transactional 내에서 테스트하는 방법
@Async로 실행하는 메서드에 대해 @Transactional 테스트를 수행하게 되면 문제가 발생합니다. (주석은 무시하셔도 좋습니다)위 메서드에 대해 테스트를 수행하기 위해 위와 같이 저장 후 테스트를 수행하여 검증하는 로직이 있는데, 값이 정상적으로 update되어 저장됐는지를 확인해야하지만, 분명히 동기적으로 작동시켰을 때는 정상적으로 동작했던 코드임에도 불구하고 @Async 옵션을 통해 수행하면 오류가 발생했습니다. 또한, 해당 메서드에서는 given에서 분명히 저장했던 Submit을 찾을 수 없다는 예외가 발생합니다. 이는 테스트 메서드에 달려있는 @Transactional로 인해, 현재 "Submit" 인스턴스를 저장한 트랜잭션이 커밋되지 않은 상태에서 다른 비동기 스레드가 해당 사항을 조..
2024.06.07 17:25 -
[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 21:48 -
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 13:39 -
ScheduledExecutorService를 통해 일정 시간 후 작업 수행되는 기능 만들기 (시험 시간 후 종료 상태로 변경하는 기능 만들기)
모두의 랜덤 디펜스에서 제한 시간이 존재하는 시험 기능이 있습니다. 이전 프로젝트까지는 Client에서 직접 시험을 종료 시키는 API를 호출한 뒤, 백엔드에서 종료를 반영하는 역할을 수행했지만, 이 경우는 "사용자가 시험 도중에 강제 중단하는 경우" 를 완벽하게 해결할 수 없었습니다. 사용자가 중도에 시험을 강제 종료할 경우 client에서 시험 종료 API를 호출할 수 없었고, 시험 기록 일부가 몇 달이 지나도 IN_PROGRESS로 남아있는 현상이 발생했습니다. 따라서 이번에는 시험이 시작된 후 제한 시간이 지나면 종료시키는 로직을 추가하고자 했습니다.Spring에서 일정 시간 후 DB 필드를 종료시키기 아주 간단한 CompletableFuture아주 간단하게 생각할 수 있는 방법은 Complet..
2024.04.29 18:30 -
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 17:42 -
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 19:35 -
@WebMvcTest를 이용한 Controller 테스트 시 Spring Security에 대해서
@WebMvcTest는 컨트롤러 레이어의 테스트를 위한 어노테이션입니다. Using this annotation will disable full auto-configuration and instead apply only configuration relevant to MVC tests (i.e. @Controller, @ControllerAdvice, @JsonComponent, Converter/GenericConverter, Filter, WebMvcConfigurer and HandlerMethodArgumentResolver beans but not @Component, @Service or @Repository beans) 따라서 WebMvcTest는 Spring 전체 컨텍스트를 로드하지 않고 M..
2024.04.21 20:13