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

공부노트

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

공부노트

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

전체 글 (44)
OpenSSH의 ControlMaster, ControlPersist를 통한 연결 비용 최소화

ssh 커넥션을 자주 열고 닫는 환경에서는 매번 TCP 연결, 키 교환, 인증, 세션 초기화를 반복하는 비용이 꽤 크다.이 글에서는 OpenSSH portable의 실제 구현을 참고하여 TCP 커넥션 위의 논리적인 SSH session과 channel을 OpenSSH가 어떻게 관리하고 재사용하는지 정리해 본다.1. TCP connection, SSH session, channel의 관계ssh를 쓰다 보면 “세션을 연다”, “커넥션을 유지한다”, “터널을 만든다” 같은 말을 섞어 쓰게 된다. 실제 구현을 볼 때는 이 단어들을 조금 분리해서 보는 편이 좋다.먼저 전체 구조를 보면 대략 이렇다.TCP connection└─ SSH transport: 암호화, MAC, key exchange, rekey └..

기타 2026. 4. 26. 16:50
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
이전 1 2 3 4 ··· 8 다음
이전 다음
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
  • logback-spring.xml
  • Fromtail
  • 스프링
  • ControlMaster
  • 생성자 주입
  • GitHub Discussion 템플릿
  • Spring 테스트
  • Payload 암호화
  • stubbing
  • 함수형 인터페이스
  • MySQL
  • 람다식
  • invokedynamic
  • JPA JSON
  • 의존성 주입
  • JPA
  • RandomPort
  • Jenkins 예약 배포
  • springboottest
  • Spring Boot Monitoring
  • ControlPersist
  • multiplebagsfetchexception
  • GitHub Discussion Template
  • thenComparing
  • java switch case
  • Spring
  • MySQL 이벤트 스케줄
  • 자바
  • GitHub Discussion
  • Java
more
«   2026/07   »
일 월 화 수 목 금 토
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

티스토리툴바