반응형

JAVA 151

[Spring] JUnit5 에서 OutputCapture를 이용한 로그 테스트 해보기

최근에 우연히 로그를 테스트하는 방법에 대해 알게돼서 기록용으로 남겨보려 한다.바로 Spring Boot 에서 제공해주는 OutputCaptureExtension 이다.  Spring Boot 2.2.0 이상의 환경이라면 gradle에 별도의 추가설정 없이 사용이 가능하다.안내돼있는 것처럼, System.out, System.err 로 출력되는 코드들을 캡처해서 AssertJ, JUnit 테스트에서 로그 출력 여부를 확인할 수 있다. 참고로 @Slf4j 의 log.info, log.error 로그 출력 캡처도 가능하다.따라서 Java, Kotlin의 웬만한 환경에서는 다 사용이 가능하리라 생각한다.테스트회원가입 (signUp 메서드)을 진행하면 아래 코드와 같이 log.info 로 회원가입 로그를 찍는다..

[240406] GDSC Konkuk KPrintf 행사 참여 후기

아는 지인 중 샤인(https://github.com/zbqmgldjfh)이랑 수지누나(https://github.com/sujileelea)가 발표한다고 해서 참여한 행사. GDSC Konkuk 리더이신 현우님(https://github.com/l2hyunwoo) 이 준비하신 걸로 알고 있다. (맞나?) 샤인이 발표하는 헥사고날 아키텍처는 우리 팀의 일부 프로젝트에서 사용하기도 하고, 샤인이 발표하기도 해서 들어보려고 하고, Vision Pro로 접해보는 공간 컴퓨팅도 수지누나가 발표하고, 아예 새로운 분야여서 들어보기로 했다. 그리고 CS와 함께하는 BE 이야기 세션은 흥미로워보여서 중간에 2시부터라도 들어보려 했다. 일정 상 12시부터 3시까지만 참여하긴 했지만 이에 대해 후기를 적어보려 한다. ..

[Spring] @Transactional(readOnly=true)에서 write 시 예외 좀 더 살펴보기

개발하던 도중 아래 에러를 만났다. The MySQL server is running with the --read-only option so it cannot execute this statement 에러 발생 원인은 @Transactional(readOnly=true) 어노테이션이 붙어진 메서드에서 save 로직을 했기 때문이다. 근데 이 readOnly 옵션에 대해 의견이 분분했다. 그래서 이번 기회에 조금 더 살펴보려 한다. 코드 쪽을 쭉 살펴보면서 분석해봤으며, 혼자서 분석해본 것이라 틀린 내용이 포함될 수 있다. 결론부터 말하자면 아래와 같다. H2 DB는 readOnly 무시됨. (정말 유명한 사실이다.) MySQL, MariaDB는 readOnly 시 락 걸고, 여기에 위배되는 로직 작성 시..

[Spring] Amazon SNS, SQS 이벤트 순서 역전 및 유실에 대처해보자

타 서비스 간 통신을 위해 API Call 뿐 아니라, event 방식으로도 많이 이용한다. 특히, 강결합을 제외하고 싶을 때 + 서로간의 양방향 통신이 아닌, 특정 행위 발생 시 단방향으로 메시지를 보내고 싶을 때에 이벤트를 보내는 방식을 고려하게 된다. 이벤트를 보내는 방식은 다양하게 존재한다. 먼저, @EventListener를 이용하여 동일 서비스 내에서 보낸 이벤트를 받아 처리하는 방식이 있다. 이 방식은 이미 지난번에 작성한 포스팅이 존재한다. https://kth990303.tistory.com/441 [Spring] 이벤트 발행 및 @TransactionalEventListener을 이용한 의존성 줄이기 사이드 프로젝트에서 회원탈퇴 로직을 구현하는 백로그를 담당중이었다. 하지만 회원 탈퇴는..

[231115] 우아콘 2023 참여 후기

우아한형제들 주관 테크컨퍼런스인 WOOWACON 2023에 참여했다! https://woowacon.com/ WOOWACON 2023 한 번의 배달을 위해 필요한 모든 기술들 woowacon.com 정말 인기가 많았고 경쟁이 치열했다고 알고 있는 우아콘 2023. 확실히 사람들이 정말 많았다. 그리고 우테코, 우형 사람들이 정말 많았다...ㅋㅋ 이번 우아콘은 오프라인으로 열린다는 소식을 듣고 기대에 부푼 마음으로 참여해보았다. 사내에서 주최되는 행사이기도 하고, 사내 정책에 따라 컨퍼런스 참여는 근무시간으로 인정받을 수 있어서 팀원분이랑 함께 세션을 들으러 갔다. 굉장히 많은 세션들이 있었고, 나는 아래와 같이 세션을 들었다. 11:00 ~ 11:40 A-대규모 트랜잭션을 처리하는 배민 주문시스템 규모에..

[231023] 흔한 백엔드 개발자 모임 컨퍼런스 후기

10월 23일 월요일에 개최된 `흔한 백엔드 개발자 모임` 컨퍼런스에 다녀왔다! https://festa.io/events/4028 흔한 백엔드 개발자 모임 | Festa! Festa에서 당신이 찾는 이벤트를 만나보세요. festa.io 알게 된 경로는 넥스터즈 단톡방이었다. 넥스터즈 활동이 끝난 이후에도 해당 톡방에는 채용공고 모집이나 컨퍼런스 홍보글이 올라오곤 한다. 이 세션은 넥스터즈에서 활동하신 분께서 주최하는 컨퍼런스여서 넥스터즈 단톡방에 홍보가 됐었는데, 꽤나 흥미로운 주제들이 많아보여서 참여신청을 눌렀다. ZGC는 JDK 17 버전에서 소개되는 GC 정도로만 알고 있었고, Virtual Thread와 Project Loom은 완전 최신에 오픈한 기술 정도로만 알고 있었다. 사실 내가 속한 사..

[Spring] @async 로직 실패 일대기, ThreadPoolTaskExecutor의 awaitTerminate와 Async

애플리케이션을 만들다보면 비동기 로직을 호출할 때가 상당히 많다. 별도의 스레드에서 돌아가면서 추후에 응답값을 반환해도 되는 경우, 성능 향상을 위해 비동기를 쓰는 것. 하지만 그렇기 때문에 결과를 예상하기가 더 어려워 의도치 않은 현상이 종종 발생하곤 한다. 이번에 발생한 문제는 아래와 같다. 스프링 애플리케이션 실행 해당 로직에는 비동기 로직을 호출 비동기 로직 수행 중, 스프링 애플리케이션 종료. 비동기 로직 중 일부 실패 스프링 애플리케이션이 비동기 async 로직을 다 수행하지 않았음에도 종료된 것이다. 참고로 보통 이런 문제는 애플리케이션 내 일반적인 로직 수행하는 경우보단, 스프링 배치를 수행할 때 발생할 수 있을 것으로 보인다. 보통 애플리케이션 서버를 직접 다운시키는 경우는 없을테니 말이..

[Spring] Apache POI 엑셀 다운 vs opencsv CSV 다운 로직 및 성능 비교하기 (feat. parallelStream)

대량 데이터를 엑셀로 다운로드하는 API가 있다. 몇백 건 정도일 경우 엑셀 다운로드 하는 데에 오랜 시간이 걸리지 않지만, 수십만~수백만 건의 데이터를 엑셀로 다운로드하는 경우 수십초를 기다려야 했었다. 또한 Java heap 메모리도 굉장히 많이 차지했다. 보통의 경우 JVM의 GC가 알아서 잘 동작하기 때문에 Heap 메모리를 걱정할 이유가 없지만, 해당 api를 사용하면 heap usage가 한계치까지 도달하는 모습을 확인할 수 있었다. G1 Eden, Survivor 영역에서 나아가 G1 Old Gen이 1GB를 넘기는 현상까지 발생했다. 따라서 엑셀에서 csv로 변경하였는데 이번에는 이러한 일대기를 작성해보려 한다. Apache POI 라이브러리 엑셀 다운로드가 어떠한 로직으로 작성돼있었는지부..

[230826] 유스콘 2023 컨퍼런스 후기

2020년부터 시작된 유스콘(YOUTHCON) 행사. 올해도 어김없이 제이슨이 주관한 2023년 유스콘 행사가 시작됐다! 2021년에는 아무것도 모르는 상태로, 2022년에는 우아한테크코스 학생 신분으로 들었었는데, 올해는 신입 개발자 신분으로 듣는 거라 또 다른 느낌으로 다가올 듯하여 기대에 부푼 마음으로 참가해보았다. 유스콘 2023 행사 일정표는 아래와 같다. https://frost-witch-afb.notion.site/YOUTHCON-23-a026c94d997e46db9396283ed869a922 YOUTHCON'23 유쾌한 스프링방에서 탄생한 유스콘은 👨‍🎓 젊은 개발자와 👨‍🏫 선배 개발자가 함께 가치 있는 기술에 관한 정보와 경험을 공유하는 콘퍼런스입니다. 여기서 발표하는 사람들을 잘 기..

[JUnit5] Archunit 라이브러리를 이용한 아키텍처 테스트

간혹 통합테스트를 작성하다보면 아래와 같은 생각이 들곤 한다. "비즈니스 로직이 의도한대로 작동되는지 테스트는 할 수 있겠어. 하지만 로직 외에 아키텍처 의존성을 테스트할 수는 없을까?" Archunit 라이브러리를 이용하면 아키텍처 의존성, 클래스명 등을 테스트할 수 있다! 참고로 Archunit Guide는 아래 링크에서 확인할 수 있다. https://www.archunit.org/userguide/html/000_Index.html#_introduction ArchUnit User Guide ArchUnit is a free, simple and extensible library for checking the architecture of your Java code. That is, ArchUnit..

반응형