본문 바로가기 메뉴 바로가기

공부노트

프로필사진
  • 글쓰기
  • 관리
  • 태그
  • 방명록
  • RSS

공부노트

검색하기 폼
  • 분류 전체보기 (43)
    • Java (15)
    • DB (2)
    • JPA (2)
    • 네트워크 (1)
    • Git & GitHub (2)
    • 기타 (2)
    • Web (2)
      • Spring (9)
    • 하루스터디 (7)
  • 방명록

전체 글 (43)
ForkJoinPool 아키텍처와 경합 최소화

Java 7부터 도입된 스레드 풀 ForkJoinPool은 Java 5의 전통적인 ThreadPoolExecutor와는 구조와 동작 방식이 특이하다. 직접 ForkJoinPool을 사용한 적은 없더라도 병렬 스트림, CompletableFuture, 가상 스레드 풀 등 다양한 자바 기능들이 내부적으로 ForkJoinPool를 의존하여 나도 모르게 사용하고 있었을 가능성이 크다. ForkJoinPool은 멀티 코어 CPU를 최대한 효율적으로 활용하는 것을 목표한다.코어 수와 유사한 개수의 스레드를 만들고 이것들의 가동률을 100%로 유지한다.병렬도와 무관하게 경합을 고려해야 하는 로직을 최소화한다.ForkJoinPool구현의 주요한 아이디어들을 살펴보자.1. ForkJoinPool내의 경합을 최소화환 ..

Java 2025. 12. 19. 13:58
WebDAV와 NGINX의 ngx_http_dav_module

WebDAV WebDAV는 HTTP 1.1 프로토콜의 확장 프로토콜이다.DAV는 Distributed Authoring and Versiong의 약자로, HTTP보다 세부적인 웹 기반의 자원 관리와 관련된 표준이다. 아래의 예시처럼 HTTP에서는 볼 수 없는 특별한 메서드들이 존재한다.LOCK / UNLOCK: 자원에 대한 락 취득 / 해제MKCOL: 디렉터리 생성MOVE / COPY: 자원 이동 / 복사PROPFIND / PROPPATCH: 자원에 정의된 프로퍼티 조회 / 수정 WebDAV의 장점 HTTP 1.1과 호환되므로 익숙한 HTTP 관련 구현 기술들을 그대로 사용 가능보통 구현 기술들이 웹 서버와 같은 포트(80, 443)를 사용하여 웹 서버에 적용한 보안 등의 인프라를 그대로 적용 가능특정 ..

Web 2025. 2. 5. 23:33
List 초기화와 MultipleBagFetchException 발생 원인

일을 하면서 OneToMany 관계를 여럿 가지는 부모 엔티티를 자식과 함께 가져와야만 하는 경우들을 마주친다.때로는 비즈니스 제약으로 규모는 크지 않으나 부모 - 자식1 - 자식2 등의 2개 이상의 계층을 한 번에 가져와야 하는 경우도 있다. 왜 hibernate는 단일 쿼리로의 다중 List 초기화를 방지하며,왜 부모는 자식을 항상 Set이 아닌 List로 초기화할까? 환경: hibernate-core 6.5.3 Final MultipleBagFetchException하나의 쿼리에서 둘 이상의 List를 Fetch Join으로 초기화하는 것은 불가하다. Lazy Loading으로 Parent의 두 Child 컬렉션을 설정해둔 뒤 두 개의 Fetch Join으로 한 번에 연관된 데이터를 가져오려 하면 ..

JPA 2024. 11. 10. 17:52
[InnoDB] 인덱싱되지 않은 컬럼으로 UPDATE 시 데드락이 발생한다

결제 서비스를 만들고 테스트하던 중 인덱싱 되지 않은 컬럼을 검색 조건으로 활용한 Update에서, 단건의 요청 처리에 대해 문제가 없었으나 다수의 요청 동시 처리 시 데드락이 발생하는 상황을 경험했다.   1. 데드락 확인 org.springframework.dao.TransientDataAccessResourceException: execute; SQL [UPDATE payment_ordersSET payment_order_status = :status, updated_at = CURRENT_TIMESTAMPWHERE order_id = :orderId]; Deadlock found when trying to get lock; try restarting transaction 스프링을 통해 어떤 로직을..

DB 2024. 7. 8. 00:58
@Async의 ThreadPoolTaskExecutor 설정하기

최신의 스프링 부트 애플리케이션에서 Async, Scheduled 등을 사용하면 가상 스레딩을 활용하지 않는 이상 ThreadPoolTaskExecutor가 구현체로 선택된다. 기본적인 설정, 종료 시점의 예약 작업 핸들링 설정 등을 설명한다.  Task Executor 스프링 어플리케이션에서 @EnableAsync 설정을 추가하고 @Async가 붙은 메서드를 런타임에 호출 시 Runnable 혹은 Callable의 형태로 스레드 풀의 Blocking Queue에 작업을 등록한 뒤 비동기로 처리된다. 비동기 처리 시 작업을 등록할 스레드 풀이 필요한데, 스프링 부트가 아닌 순수 스프링 환경에서는 별도의 설정이 없다면  AsyncExecutionInterceptor에 의해 요청마다 스레드를 새로 생성하는 ..

Web/Spring 2024. 6. 15. 19:47
컨테이너에서의 사용자 프로세스 제한과 UID

회사에서 한 장비에 수십 개의 도커 컨테이너를 동시에 운용할 상황이 생겼다.컨테이너 각각에서 작업이 이루어지고 ssh를 통해 접속해서 확인할 수 있도록 구성하였는데,컨테이너가 많아지자 모든 컨테이너로의 ssh 접속이 불가해졌다는 연락을 받았다.ssh -vv로 로그를 확인하니 접속 시 인증 단계는 정상적으로 넘어가나, 셸 할당이 실패하는 상황이었다. 결론적으로는 ssh 접속 시의 사용자에 대한 프로세스 제한을 늘려주어 임시로 해소하였고,각 컨테이너에서의 사용자 UID를 구분해 주어 근본적인 문제를 해결하였다. 컨테이너에서의 ulimit -a로 프로세스 제한을 확인했을 때는 분명 unlimited로 표시되었고,서버 자원은 충분하며 각 컨테이너에서의 프로세스/스레드는 수백 개 수준이었는데도 프로세스 생성이 불..

카테고리 없음 2024. 3. 24. 17:50
이전 1 2 3 4 ··· 8 다음
이전 다음
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
  • Spring 테스트
  • stubbing
  • comparing
  • 자바
  • MySQL
  • GitHub Discussion
  • 람다식
  • 스프링
  • Spring
  • MySQL 이벤트 스케줄
  • thenComparing
  • Payload 암호화
  • JPA JSON
  • RandomPort
  • 생성자 주입
  • GitHub Discussion 템플릿
  • 가변 인수
  • Jenkins 예약 배포
  • java switch case
  • logback-spring.xml
  • Fromtail
  • multiplebagsfetchexception
  • Java
  • 함수형 인터페이스
  • Spring Boot Monitoring
  • JPA
  • GitHub Discussion Template
  • 의존성 주입
  • springboottest
  • invokedynamic
more
«   2025/12   »
일 월 화 수 목 금 토
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함

Blog is powered by Tistory / Designed by Tistory

티스토리툴바