본문 바로가기
반응형

Develop234

[Coroutines] 코루틴 빌더, 코루틴 컨텍스트 코루틴 스터디를 하며 정리 중인 시리즈 글왜 코루틴을 써야할까?[Coroutines] 코루틴 빌더, 코루틴 컨텍스트[Coroutines] 구조화된 동시성[Coroutines] 코루틴 스코프 함수[Coroutines] 디스패처[Coroutines] 코루틴과 공유상태 🔅 코루틴 빌더 코틀린 코루틴은 코루틴을 일시 중단시킨다. 이런 방식을 통해 스레드를 블로킹할 때보다 훨씬 가볍게 사용할 수 있다. 그런데 이 코루틴 중단은 중단 함수 내에서만 일어날 수 있다. 그리고 중단함수는 중단함수 내에서만 호출되어야 한다. 중단함수가 최초로 시작되는 지점은 어디일까? 바로 코루틴 빌더다. 🔸 코루틴 빌더중단 함수가 시작되는 지점모든 코루틴 빌더는 자신의 Job을 생성 (Job에 대한 설명은 하단에 있다.)launch.. 2024. 6. 23.
왜 코루틴을 써야할까? 코루틴 스터디를 하며 정리 중인 시리즈 글왜 코루틴을 써야할까?[Coroutines] 코루틴 빌더, 코루틴 컨텍스트[Coroutines] 구조화된 동시성[Coroutines] 코루틴 스코프 함수[Coroutines] 디스패처[Coroutines] 코루틴과 공유상태 😏 스레드의 한계 JVM은 스레드를 기반으로 동작한다. 단일 스레드는 동시 작업을 수행할 수 없기 때문에 하나의 작업이 오래 걸리면 다른 작업의 처리도 지연된다. 이를 극복하기 위해 등장한 것이 멀티 스레드다. 멀티 스레드는 스레드를 여러 개 사용해 작업을 처리하는 것으로, 병렬 처리가 가능해진다. (동시성과 병렬성의 차이는 동시성 (Concurrency) vs 병렬성 (Parallelism) 글을 참고하길 바란다.)   멀티 스레드 이미지를.. 2024. 6. 9.
[Reactor] 서버 느리게 만드는 API 개발하기 (feat: block) 1. 엉망진창 시작 🤯 Reactor에 대해서 'WebFlux는 비동기 프로그래밍할 때 쓴다', 'Mono는 단일 요소, Flux는 여러 요소' 이 두 가지 외에는 아무것도 모르는 상태에서 로직을 작성해야 했다. WebFlux의 기본 문법을 공부하는 중이긴 했지만, 학습 속도보다 업무 진행이 훨씬 급했다. 무작정 코드를 작성하니 어떻게든 내가 원하는 결과가 만들어졌다. 베타 서버 데이터를 이용한 테스트도 완료했다. 성공 케이스, 실패 케이스, 에러 케이스 모두 예상한대로 돌아갔다. 며칠 뒤, 퇴근했다가 갑자기 베타 서버가 이상하다는 슬랙이 온다.😭  2. 문제의 코드 😵 자세한 비즈니스 로직을 생략하기 위해 조금 억지스러운 예제를 가져왔다. 상품을 조회할 때, 상품을 판매하는 판매사명이 "test".. 2024. 5. 6.
[Spring] ReactiveCrudRepository를 이용한 삭제 시 주의점 😟 문제 상황 찜을 삭제하고 별도의 작업을 위해 event publish 하는 로직을 작성하였다.fun remove(favorite: Favorite): Mono = favoriteRepository.deleteById(favorite.id) .flatMap { productService.findById(favorite.productId) } // event publish할 때 필요한 데이터 조회 .flatMap { product -> val favoriteRequest = toFavoriteEventRequest(favorite, product) Mono.fromCallable { favoriteEventPublisher.publ.. 2024. 4. 28.
[Reactor] zip vs zipWith vs zipWhen 💡 zip() 여러개의 Publisher를 인자로 넘기고, 이 모든 Publisher들의 결과를 한 묶음으로 조회할 수 있다. Publisher를 최대 8개까지 넘길 수 있다. 예외나 빈값이 발견되면 즉시 에러/완료 처리된다. Flux userFluxFromStringFlux( Flux usernameFlux, Flux firstNameFlux, Flux lastNameFlux ) { return Flux.zip(usernameFlux, firstNameFlux, lastNameFlux) .map(it -> new User(it.getT1(),it.getT2(),it.getT3())); // 아래와 같이 각 결과에 이름을 붙일 수 있다. // .map((username, firstName, lastNam.. 2024. 4. 7.
[Java] compiler message file broken 에러 compiler message file broken: key=compiler.misc.msg.bug arguments=11.0.13, {1}, {2}, {3}, {4}, {5}, {6}, {7} java.lang.AssertionError: Incorrect number of arguments; expected 4, found 0 에러 에러 발생 코드 에러가 발생한 코드를 살펴보자면 아래와 같다. REST API 호출 시 발생하는 예외를 executeApi() 메서드를 통해 공통적으로 처리했다. 이 코드 중에서 ParameterizedTypeReference(){} 부분에서 에러가 발생했다. @Slf4j @RequiredArgsConstructor @Service public class AuthUserA.. 2024. 3. 17.
[SpringDoc] 쿼리 파라미터가 이상하다? SpringFox에서 SpringDoc으로 마이그레이션하던 와중, 몇가지 이슈가 발생했다. (참고글: [SpringDoc] SpringFox -> SpringDoc 마이그레이션 일지) 그 중에서도 쿼리 파라미터와 관련된 이슈들을 해당 글에서 정리해보고자 한다. ❓ Swagger에서 @ModelAttribute request를 json 형태로 받는 현상 스프링에서 @ModelAttribute를 이용하면 쿼리 파라미터 목록을 DTO로 받을 수 있다. 이때 SpringFox에서는 아래와 같이 필드 하나하나를 따로 입력받을 수 있었다. 하지만 SpringDoc에서는 아래와 같이 json 형태로 입력하도록 변경되었다. 쿼리 파라미터를 따로 입력하고 싶다는 요구사항이 들어와서 방법을 고민하게 되었다. 💡 해결방법.. 2024. 2. 18.
[SpringDoc] 우리 enum이 달라졌어요 SpringFox에서 SpringDoc으로 마이그레이션 하던 와중, 몇 가지 이슈가 발생했다. (참고글: [SpringDoc] SpringFox -> SpringDoc 마이그레이션 일지) 그중에서도 enum과 관련된 이슈가 많았는데, 어떤 이슈가 발생했고 어떻게 해결했는지 그 방법에 대해 공유하고자 한다. 이모티콘 설명 - ❓ 이슈 - ✅ 선택한 방법 - ⬜️ 선택되지 않은 방법 ❓ name()이 아닌 toString() 값이 노출되는 현상 SpringFox에서 SpringDoc으로 전환하자, enum 타입의 필드들이 이상한 형태로 조회되었다. 예를 들어, 아래와 같이 Color라는 enum이 있다고 가정해 보자. @ToString public enum Color { ORANGE("red", "yello.. 2024. 1. 28.
[SpringDoc] SpringFox -> SpringDoc 마이그레이션 일지 목차 0. 서론 1. Swagger vs SpringFox vs SpringDoc 2. 왜 SpringFox보다 SpringDoc일까? 3. SpringDoc으로 마이그레이션하기 4. 트러블슈팅 0. 서론 최근 팀 코드에 SpringFox를 SpringDoc으로 전환하는 작업을 진행하고 배포까지 무사히 마쳤다. 해당 글에서는 SpringDoc이란 무엇이고, 왜 SpringDoc 마이그레이션 하게 되었는지, 어떻게 마이그레이션 했고 그 과정 중 어떤 이슈가 있었는지 내용을 정리하려 한다. 1. Swagger vs SpringFox vs SpringDoc 🟢 Swagger API 설계, 테스트, 문서화 등을 편리하게 이용할 수 있게 돕는 프레임워크 Swagger UI: OenAPI를 기반으로 시각적 문서.. 2024. 1. 14.
반응형