study19 [Spring Data JPA] JPA Auditing을 이용한 생성/수정 이력 추적 0. 들어가며서비스 운영 시 데이터가 생성되고 수정한 이력을 기록하고 트래킹하는 것은 중요하다. Spring Data JPA에서는 Auditing이라는 기능을 제공한다. 이를 통해 엔티티가 생성되고, 변경되는 시점을 감지해 생성시각, 수정시각, 생성자, 수정자를 기록할 수 있다.1. Spring Data JPA Auditing 적용Spring Data JPA Auditing을 사용하기 위해서는 @EnableJpaAuditing 어노테이션을 사용해 Auditing을 활성화해야 한다.Application 클래스에 직접 붙이거나, @Configuration 어노테이션이 사용된 클래스에 붙이면 된다.필자는 후자의 방법으로 Auditing을 활성화했다. | JpaAuditingConfig.java@EnableJp.. 2024. 7. 3. [Java] Reflection Reflection 1. Reflection 리플렉션(Reflection)은 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 필드, 생성자에 접근할 수 있도록 해주는 자바 API다. 리플렉션은 실행 시간에 동적으로 특정 클래스의 정보를 추출할 수 있다. 리플렉션을 사용하면 접근 제어자와 무관하게 런타임에 클래스의 메소드를 호출할 수 있다. java.lang.reflect 패키지 아래에서 리플렉션에 필요한 클래스들을 제공한다. 1.1. Reflection을 통해 가져올 수 있는 정보 Class Constructor Method Field Enum Annotation Parent Class & Interface etc 1.2. Reflection 기능 Class 가져오기 {클래스 타입}.clas.. 2024. 3. 3. [Hibernate] Soft Delete in Hibernate 0. 들어가며데이터베이스에서 데이터를 삭제하는 방법으로는 물리 삭제(Hard Delete)와 논리 삭제(Soft Delete)가 있다. Hard Delete는 DELETE 쿼리를 수행해 데이터베이스에서 데이터를 영구적으로 삭제하는 방법이다. Soft Delete는 UPDATE 쿼리를 수행해 레코드의 활성 여부를 나타내는 필드를 비활성으로 수정하는 방법이다.Soft Delete는 데이터가 유지되기 때문에 데이터 복원에 유리하다. 하지만, 데이터가 지속적으로 쌓이기 때문에 데이터베이스의 용량이 커질 수 있으며, SELECT 쿼리를 이용한 데이터 조회 시 활성 여부를 체크하는 검색 조건이 추가되어야 한다.1. How to Implement Soft Delete with HibernateHibernate 6.4.. 2024. 2. 6. [JPA] Join vs Fetch Join 0. 들어가며 JPA를 사용하다보면 N+1 문제를 마주치게 되는데, 이를 해결할 수 있는 방법 중 하나가 Fetch Join이다. 그렇다면 일반적으로 사용하는 Join과 Fetch Join은 어떤 점이 다른지 알아보기 위해 해당 글을 작성하게 되었다. 1. Join vs Fetch Join 일반 Join은 조회의 주체가 되는 엔티티만 SELECT해서 영속화하고, 연관된 엔티티는 영속화하지 않는다. 반면 Fetch Join은 조회의 주체뿐만 아니라 연관된 엔티티까지 모두 SELECT하여 영속화한다. Fetch Join을 사용하면 연관된 엔티티가 모두 영속화되기 때문에 FetchType이 Lazy인 엔티티를 참조해도 이미 영속성 컨텍스트에서 관리하고 있어 SELECT문이 실행되지 않아 N+1문제를 해결할 수.. 2024. 1. 21. [AWS] EC2 프리티어 메모리 부족 현상 해결 0. 들어가며 '직팅' 서비스의 성능 테스트를 위해 nGrinder를 AWS EC2에 설치 및 실행했다. t2.micro 인스턴스로 실행 시 아래와 같이 메모리 부족으로 인해 nGrinder 에이전트가 죽는 문제가 발생했다. 참고로, t2.micro 인스턴스의 사양은 아래와 같다. 이와 같은 문제를 해결하기 위해서 EC2의 인스턴스 유형 변경을 통해 RAM의 성능을 높일 수 있다. 하지만 해당 방법은 비용 부담이 발생하기 때문에 스왑 메모리(Swap Memory)을 통해 메모리 부족 현상을 해결했다. 1. 스왑 메모리(Swap Memory) 스왑 메모리(Swap Memory)란 컴퓨터의 주 메모리(RAM)가 모두 사용돼 추가적인 메모리가 필요한 경우 사용되는 보조 메모리다. 주 메모리가 가득 차거나 시스.. 2024. 1. 7. [Spring] Redis Sorted Set을 이용한 검색 랭킹 조회 기능 개선 0. 들어가며 현재 구현 중인 블로그 검색 서비스에서는 인기 키워드 목록 조회를 위해 검색 내역을 H2 DB에 저장하고 있다. H2 DB는 멀티스레딩을 지원하기 때문에 동시성 처리가 필요하다. 따라서 인기 키워드에 대한 동시성 문제를 해결하기 위해 Lock을 사용할 수 있다. 하지만 H2 DB의 Lock처리를 하는 대신 싱글 스레드 환경의 Redis를 이용해 동시성 문제를 해결하면서 Redis에서 지원하는 Sorted Set(ZSet)을 이용해 정렬 처리까지 하려고 한다. 1. Redis Sorted Set Redis에서 지원하는 자료구조 중 하나인 Sorted Set은 score에 의해 정렬된 중복되지 않은 문자열을 갖는 Collection이며, 동일한 score를 갖는 문자열의 경우 사전순으로 정렬된.. 2023. 12. 10. [Jenkins] Jenkins 빌드 결과 Slack 알림 설정 0. 들어가며프로젝트를 진행하던 중 프론트엔드 수정 사항이 서비스에 반영되지 않고 있다는 사실을 한참이 지나서야 발견했다.이때문에 코드에 문제가 있어 반영이 안된다고 생각해 불필요한 코드 수정을 반복하기도 했다.이러한 문제를 방지하기 위해 Jenkins의 빌드 결과를 Slack을 통해 알림 받을 수 있도록 환경을 구축하게 되었다.1. Slack에 Jenkins 플러그인 추가젠킨스 알림을 받을 채널 생성앱 > jenkins 검색 > Jenkins CI 추가슬랙에 추가채널 선택 > Jenkins CI 통합 앱 추가3단계 팀 하위 도메인 & 통합 토큰 자격 증명 ID 복사기타 설정 후 설정 저장구성 추가 확인2. Jenkins에 Slack 플러그인 추가Jenkins 관리 > Plugins > Available.. 2023. 10. 9. [Spring Boot] 이메일 인증 with NCP & Redis 1. NCP 세팅 1.1. 액세스 키 발급 1. 마이페이지 > 계정 관리 > 인증키 관리 > 신규 API 인증키 생성 2. 생성된 액세스 키와 시크릿 키를 저장해 놓는다. 1.2. Cloud Outbound Mailer 이용 신청 콘솔 > Services > ‘Cloud Outbound Mailer’ 선택 이용 신청 > 전체 동의 > 확인 2. Spring Boot Mail 전송 구현 2.0. Cloud Outbound Mailer 요청 예시의 Body 부분과 createMailRequest의 요청 파라미터를 보고, MailRequest 필드(title, body, senderAddress, senderName, recipients) 및 MailRequestRecipients 필드(address, nam.. 2023. 9. 25. [Spring WebSocket] Redis를 이용한 채팅 고도화 0. In-Memory 기반 Message Broker 문제점 Spring에서 제공하는 STOMP를 활용해 내장된 Simple Message Broker를 통해 채팅 서버 구현이 가능하지만, Spring 서버의 내부 메모리에서 동작하게 되면 아래와 같은 문제가 발생할 수 있다. 서버거 다운되거나 재시작하면 Message Broker에 있는 데이터들이 유실될 수 있다. 다수의 서버일 경우 서버 간 채팅방을 공유할 수 없어 다른 서버 간에 있는 사용자와의 채팅이 불가능하다. 이러한 문제를 해결하기 위해 외부 Message Broker를 사용할 수 있다. 대표적으로 Apache Kafka, Redis, RabbitMQ 등이 있다. 1. Redis Redis는 STOMP 프로토콜을 지원하지 않지만, Redis가.. 2023. 9. 1. 이전 1 2 3 다음