dev archive
close
프로필 배경
프로필 로고

dev archive

  • 분류 전체보기
    • Spring
    • Java
  • 홈
  • 태그
  • 글쓰기
[Java] JVM 청소부 GC: GC를 어떤 관점으로 봐야하는가, GC 알고리즘

[Java] JVM 청소부 GC: GC를 어떤 관점으로 봐야하는가, GC 알고리즘

JVM 에서의 메모리 관리JVM 안에는 모두 공유되는 영역인 Heap 부터 각각의 메서드의 작업별로 할당되는 Stack 까지 다양한 영역이 존재한다. 프로그램을 실행하면 메서드를 실행하며 새로운 데이터들이 메모리에 추가될 가능성이 높다. Java로 구성된 프로그램을 작동시켜 놓으면 메모리가 계속 증가하게 되는데, 이런 문제점에 해답을 주는 것이 Garbage Collection, GC이다. GC는 JVM 상에서 더 이상 사용되지 않는 데이터가 할당되어 있는 메모리를 해제시켜 주는 장치이다. JVM에서 자동으로 동작하기 때문에 Java는 특별한 경우가 아니면 메모리 관리를 개발자가 직접 해줄 필요가 없다. GC 가 주로 동작하는 대상은 Heap 영역 내의 객체 중에 참조되지 않은 데이터이다.public c..

  • format_list_bulleted Java
  • · 2024. 7. 3.
  • textsms
[Spring] 이메일 인증 기능 비동기 처리와 주의사항: @Async, @EnableAsync

[Spring] 이메일 인증 기능 비동기 처리와 주의사항: @Async, @EnableAsync

기존의 코드에서 비동기 처리를 고려한 이유 클라이언트가 ‘이메일 전송 요청’에 대한 기존의 시나리오는 다음과 같습니다. 먼저, 우리의 웹 서버와 DB에서 실행되어야 할 작업들이 실행됩니다. 그리고 외부 서버인 구글 SMTP 서버로 이메일 발송 요청을 한 후, 이메일 발송에 대한 응답이 온 후에야 클라이언트에게 완료했다는 응답을 보내주고 있습니다. 또 다른 시나리오는 푸시 알림 발송을 위한 firebase 서버로 요청하는 경우가 있습니다. 마찬가지로 사용자가 (대) 댓글을 작성했을 때 푸시 알림이 발송 완료될 때까지 응답을 기다리게 해야 하는 상황입니다. 현재는 비동기가 아니기 때문에, 하나의 스레드에서 일련의 작업을 진행하고 있습니다. 그러나 비동기 처리를 도입하게 되면, 작업이 완료되기를 기다리지 않습..

  • format_list_bulleted Spring
  • · 2024. 4. 10.
  • textsms
[Spring] 프록시 방식의 AOP 한계: self-invocation 이슈

[Spring] 프록시 방식의 AOP 한계: self-invocation 이슈

Spring AOP 기반의 @Async를 공부하다가, self-invocation(내부 호출)하는 경우에는 AOP가 걸리지 않는 이슈를 마주하게 되었습니다. 왜 내부 호출하는 메서드는 AOP 타겟이 되지 못하는 것인지, 그리고 이 문제를 해결할 수 있는 방법에는 어떤 것들이 있는지 알아보겠습니다. 내부 호출 시 왜 AOP 기능이 수행되지 않을까? 이 문제는 프록시 객체와 관련이 있습니다. 따라서, 먼저 프록시에 대해 간단하게 알아보겠습니다. 프록시 적용 전 실제 객체가 스프링 빈으로 등록됩니다. 빈 객체의 마지막 @x0..은 인스턴스를 의미합니다. 프록시 적용 후 스프링 컨테이너에 프록시 객체가 등록됩니다. 스프링 컨테이너는 이제 실제 객체가 아닌 프록시 객체를 스프링 빈으로 관리합니다. 실제 객체는 스..

  • format_list_bulleted Spring
  • · 2024. 4. 9.
  • textsms
[Spring] XToOne 조회 기능에 대한 쿼리 튜닝: N+1문제 해결, 페이징 최적화

[Spring] XToOne 조회 기능에 대한 쿼리 튜닝: N+1문제 해결, 페이징 최적화

기존 상황 먼저 N+1 문제가 발생하는 기능 중 하나는 룸메이트 매칭 목록 조회 기능 중에 '로그인한 유저가 좋아요 한 매칭정보 목록을 조회하는 기능'입니다. 기존의 코드는 아래와 같습니다. 더보기 MatchingMateService.java @Service @Transactional(readOnly = true) @RequiredArgsConstructor public class MatchingMateService implements MatchingMateUseCase { private final LoadMemberPort loadMemberPort; private final LoadMatchingInfoPort loadMatchingInfoPort; private final SaveMatchingMa..

  • format_list_bulleted Spring
  • · 2024. 4. 4.
  • textsms
[Spring] 쿼리 카운터 개발기: JPA N+1문제를 찾아서

[Spring] 쿼리 카운터 개발기: JPA N+1문제를 찾아서

도입한 이유 쿼리 튜닝을 하는 과정에서 나간 쿼리의 개수를 측정하는 과정에서 불편함이 있었습니다. 특히 아이돔 프로젝트에서는 Spring-Data-JPA를 사용합니다. 그로 인해 JPA N+1 문제와 같이 의도와 다르게 발생한 쿼리의 개수를 모니터링할 필요가 있었습니다. 문제 정의 1. API의 실행 시간 측정 2. 쿼리가 실행된 개수 카운트 3. 실행된 쿼리들을 리스트업 4. N+1 문제가 의심되는 쿼리를 체크 → 의심 조건 : 동일한 SELECT 문이 2개 이상 사용되었는가 구현 방식 일반적으로 쿼리 카운터를 구현하기 위해 고려하는 방법은 2가지 입니다. 두 가지 방식 모두 적용해 보겠습니다. 방식 1. 하이버네이트의 StatementInspector 인터페이스 먼저 ORM 프레임워크인 Hiberna..

  • format_list_bulleted Spring
  • · 2024. 3. 28.
  • textsms
[Spring] 헥사고날 아키텍처 도입기: 계층형에서 헥사고날 아키텍처로

[Spring] 헥사고날 아키텍처 도입기: 계층형에서 헥사고날 아키텍처로

도입한 이유 좋은 설계는 변경에 유연하게 대응할 수 있도록 도와줍니다. 기존의 코드는 계층형 아키텍처를 채택하면서 핵심 로직을 주로 도메인과 서비스에 몰아놓은 결과, 유지보수성이 낮았습니다. 특히, 일부 서비스는 많은 의존성 주입을 필요로 하며, 새로운 기능이 추가될수록 클래스가 점점 두꺼워졌습니다. 프로젝트가 확장되면서, 강하게 결합된 부분을 변경해야 하는 경우가 생기면서 여러 사이드 이펙트를 겪게 되었습니다. 따라서 큰 책임을 지닌 객체를 분리하고, 상속과 인터페이스 등을 활용하여 추상화를 도입하고, 다른 디자인 패턴을 적용함으로써 프로젝트의 유지보수성을 높이기로 결정했습니다. 물론, 기존의 계층형 아키텍처도 특정 기술에 대한 의존성을 인터페이스를 통해 분리할 수 있습니다. 실제로 확장성을 늘리기 위..

  • format_list_bulleted Spring
  • · 2024. 3. 22.
  • textsms
  • navigate_before
  • 1
  • 2
  • navigate_next
전체 카테고리
  • 분류 전체보기
    • Spring
    • Java
최근 글
인기 글
최근 댓글
태그
  • #java
  • #LeetCode
  • #HashMap
  • #merge sort
  • #Stack
  • #LinkedList
  • #quick sort
  • #슬라이딩 윈도우
  • #Priority Queue
  • #Queue
Copyright © 쭈미로운 생활 All rights reserved.
Designed by JJuum

티스토리툴바