728x90
Java & Spring
54

Spring Data Repository 를 사용하여 Redis에 캐싱할 경우 Connection을 사용하는 문제

Repository로 Redis를 사용?Redis Repositories에서 CrudRepository를 상속받아 JpaRepository를 사용하여 DB에 데이터를 조작하는 것처럼 사용할 수 있다고 한다.예시로 다음과 같이 Repository 인터페이스를 정의할 수 있다.interface UserRepository extends CrudRepository { long countByLastname(String lastname); } id를 key 값으로 lastname이라는 value가 저장되는 것이다. 만약 객체 자체를 저장하게될 경우 JSON 형식이 아닌 HSET 명령어로 저장하는 것과 같은 결과로 저장된다. 그리고 실제로 동작할 때, 구체 클래스는 SimpleKeyValueRepository..

Java & Spring 2024.08.02

알람 기능의 Template Method + Strategy 패턴 적용기

이전 포스트에서 Template Method 패턴을 적용하여 확장성을 개선해보았다. 하지만 이후 알람을 보내야하는 이벤트가 추가됨에따라 해당 알람을 전송하는 클래스를 추가하고 변경해야하는 코드가 많아지게 된다는 문제가 있다. 따라서 이러한 문제를 개선하기 위해 Strategy 패턴을 적용한 경험을 설명해보려고 한다.설계이전 구조에서 AlarmTemplate이라는 인터페이스와 AlarmMappingHandlerAdapter라는 클래스를 추가해주었다.AlarmTemplate: Template Method를 적용한 추상 클래스의 다형성을 제공한다.AlarmMappingHandlerAdapter: 알림 전송 기능 수행을 대신 진행해준다.구현AlarmTemplateAlarmTemplate 인터페이스를 추가하고 지..

Java & Spring 2024.07.30

알림 기능의 Template Method 패턴 적용기

[Design Patterns] Template Method Pattern 에서 간단한 예시로 Template Method 패턴에 대해서 이해할 수 있다.기능 요구사항중고 거래 서비스를 개발하면서 판매자, 구매자에게 알림을 보내는 기능을 구현하게 되었다. 각 알림은 다음과 같은 경우 발생한다.거래가 완료되었을 경우, 판매자와 구매자에게 알림을 전송하고 채팅을 통해 관심을 가졌던 사용자들에게도 알림을 전송한다.판매 상태가 예약 중으로 변경 되었을 경우, 예약을 신청한 사용자에게 알림을 전송한다.예약이 취소되어 판매 상태가 판매 중으로 변경 되었을 경우, 예약을 취소한 사용자를 포함하여 채팅을 통해 관심을 가졌던 사용자들에게 모두 알림을 전송한다.구현 (패턴 적용 X)RabbitMQPublisher알림 기능..

Java & Spring 2024.07.27

운영(배포) 환경에서 jpa.show_sql=false 로 설정해야하는 이유

배경1:1 채팅 기능이 구현되어있고 상대방을 어떤 이유로 신고하는 기능이 있다고 하자. 그리고 신고할 수 있는 횟수가 제한이 없다고하면 상대방을 계속 신고할 수 있다.이때, 여러명이 상대방을 쉼없이 신고할 경우를 가정하여 테스트를 진행해보았다.부하 테스트Spring Boot로 구현한 API는 Docker 환경에 올려서 실행했으며, [CPU 2, Memory 4G]로 Resource를 설정했다.Jmeter 테스트부하 테스트는 Jmeter를 사용하여 수행했다.아래 설정은 200명의 사용자가 60초 동안 쉼없이 상대방을 신고하는 경우를 테스트하기 위한 설정이다.실행 후 TPS 그래프를 확인해보면 7 ~ 8 초 이후 갑자기 TPS가 떨어지고 중간중간에 멈추는 구간이 발생하는 것을 볼 수 있었다. 왜 요청을 잘 ..

Java & Spring 2024.07.16

[JaCoCo] 코드 커버리지 측정

테스트 커버리지테스트 범위를 측정하는 테트 품질 측정 기준이며, 테스트의 정확성과 신뢰성을 향상시키는 역할테스트 케이스의 부족한 부분을 파악하고 추가적인 테스트 케이스를 개발할 수 있음테스트 커버리지의 종류1. 구문 커버리지 (Statement Coverage)모든 구문에 대해 한 번 이상 수행하는 테스트 커버리지테스트 케이스 집합에 의해 실행된 문장의 수 / (전체 실행 가능한 프로그램 문장의 수) * 100%if (x > 0) { y = x * 2;} else { y = x / 2;}x의 값을 3으로 설정한 경우 -> 첫 번째 구문이 True가 되어 두 번째 구문이 실행x의 값을 -2 또는 0으로 설정한 경우 -> 첫 번째 구문이 False가 되어 네 번째 구문이 실행이처럼 모든 구문을 한..

Java & Spring 2024.07.10

[Spring AMQP(RabbitMQ)] 안전하게 메시지를 전달하기 위한 설정 - Dead Letter Queue(DLQ)

이전 포스트: [Spring AMQP(RabbitMQ)] 안전하게 메시지를 전달하기 위한 설정 - Consume  Dead Letter Queue는 실패하거나 전달되지 못한 메시지를 보관하는 queue이다.Dead Letter Exchange & Dead Letter Queue 생성메시지가 전달에 실패하면, 실패한 메시지는 DLX(Dead Letter Exchange)로 라우팅된다.public static final String topicExchangeName = "spring-boot-topic-exchange"; public static final String dlqExchangeName = topicExchangeName + ".dlx"; public static final String queu..

Java & Spring 2024.06.16

[Spring AMQP(RabbitMQ)] 안전하게 메시지를 전달하기 위한 설정 - Consume

이전 포스트: [Spring AMQP(RabbitMQ)] 안전하게 메시지를 전달하기 위한 설정 - Publish안전하게 메시지 Consume 하기 위한 설정우선 auto-ack를 false로 설정해주어야한다.auto-ack가 true로 설정되면 다음과 같이 동작한다.queue로 메시지 publishconsumer로 메시지 전달consumer는 queue에게 ack 리턴queue에서 메시지 삭제이때 실제로 consumer에서 메시지를 처리하는 시간이 더 길기 때문에 queue에서의 메시지가 먼저 삭제된다. 따라서 consumer에서 문제가 생겼을 경우 메시지 유실이 발생하게된다. 그리고 메시지 전달에 실패했을 경우는 DLQ(Dead Letter Queue)로 가도록 해야한다.코드 적용Spring AMQP에..

Java & Spring 2024.06.15

[Spring AMQP(RabbitMQ)] 안전하게 메시지를 전달하기 위한 설정 - Publish

이전 포스트: [Spring AMQP(RabbitMQ)] 안전하게 메시지를 전달하기 위한 설정 - Durability안전하게 Publish하기 위한 설정메시지는 메모리에 저장되며 재실행되거나 라우팅할 수 없는 경우 유실될 수 있다.mandatory를 true로 설정해주면 queue에 메시지가 추가되었을 경우 success를 반환하고 라우팅되지 않을 경우 error를 반환한다.persistent를 true로 설정해주면 메시지가 disk에 저장된다. (동시에 RAM에 저장됨)open channel에서 waitForConfirmsOrDie을 호출하여 메시지가 정상적으로 확인되었는지 알 수 있다. Spring AMQP에서는 ReturnsCallback 또는 ConfirmCallback을 사용할 수 있다.또한 l..

Java & Spring 2024.06.14

[Spring AMQP(RabbitMQ)] 안전하게 메시지를 전달하기 위한 설정 - Durability

durable이란 broker가 재시작되어도 queue가 삭제되지 않고 남을 수 있게 만드는 속성이다.(RabbitMQ를 Docker 컨테이너로 올려 실행했다.)Non-Durabledurable을 false로 설정할 경우 broker가 재시작되면 queue가 삭제될 것이다. 실제로 그런지 한 번 확인해보았다.Broker 실행broker를 처음 실행하면 아래처럼 queue가 아무것도 없을 것이다.백엔드 서버 실행Spring Boot로 개발한 백엔드 애플리케이션을 실행하게되면 다음과 같이 설정한대로 queue가 생성된다.Broker 재실행broker가 재실행할 때 두 가지 경우를 생각해볼 수 있다.백엔드 서버가 실행되는 중 Broker가 재실행되는 경우백엔드 서버가 다운되었을 때 Broker가 재실행되는 경..

Java & Spring 2024.06.13
728x90