Language/Java
-
logback 로그 설정Language/Java 2024. 10. 29. 10:51
P6spy문제p6spy를 활용해서 로그를 설정해서 사용을 하였더니 문제가 발생하였다.@Transactional(readOnly = true)public void testReadOnly() {}이렇게 설정하게 되면TransactionSynchronizationManager.isCurrentTransactionReadOnly()가 true이고 아래 ReplicationRoutingDataSource 로직에 따라 secondaries DB를 바로 보게 되어야 하는데 testReadOnly 메소드 안에서 TransactionSynchronizationManager.isCurrentTransactionReadOnly()를 찍어보면 true가 리턴되는데 ReplicationRoutingDataSource에 설정된 ..
-
p6spy 로그 설정 방법Language/Java 2024. 9. 27. 14:53
스프링부트 설정P6spyConfig이 클래스는 스프링 애플리케이션이 시작될 때 자동으로 실행되며, P6Spy의 로그 포맷을 P6spyPrettySqlFormatter라는 사용자 정의 포맷터로 설정하는 역할을 한다. 이로 인해, P6Spy가 데이터베이스 쿼리를 로그할 때 P6spyPrettySqlFormatter에 정의된 형식대로 로그를 출력하게 된다.import com.p6spy.engine.spy.P6SpyOptions;import jakarta.annotation.PostConstruct;import org.springframework.context.annotation.Configuration;@Configurationpublic class P6spyConfig { @PostConstruct pu..
-
Batch에서 FCM 발송 오류 트러블슈팅Language/Java 2024. 9. 12. 11:24
공지사항 및 푸시 발송 컨텐츠를 등록해두고 전송요청을 하게되면 배치에서 푸시를 받아야 할 대상건들을 추려내서 발송하는 형태로 서비스 중이었다. 그런데 한달쯤 전부터 푸시의 발송 실패건들이 늘기 시작했다. 푸시발송에 실패한 토큰들은 앱을 삭제하거나 거부하였을때 DB에서 물리적으로 삭제하도록 개발되어 있었는데 그러다 보니 매일 발송대상에 올라가는 푸시건수들이 실패한 건수만큼 줄기 시작하였다.. OTL.. 원인을 찾자! 원인파악 및 트러블슈팅com.google.firebase.messaging.FirebaseMessagingException: Operation is not implemented, or supported, or enabled.다른 오류들도 있었지만 포인트는 저거였다. 구글링 해보니 10건 전송하..
-
springboot 3.x + JPA + QueryDSL에서 p6spy 적용Language/Java 2024. 9. 5. 10:07
0. gradle 버전 확인필자는 1.9.2 버전을 사용할 것이다.https://mvnrepository.com/artifact/com.github.gavlyukovskiy/p6spy-spring-boot-starter/1.9.2 1. 설정1.1. build.gradle // p6spy implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.2' 2.1. application.yml jpa: database: mysql generate-ddl: false open-in-view: false hibernate: ddl-auto: none # create update none 항상 조심!! ..
-
비트마스크 적용 (QueryDSL & Hibernate 6.x)Language/Java 2024. 8. 28. 16:45
Java QueryDSL에서 비트마스크를 사용하는 이유는 여러 상태나 옵션을 효율적으로 저장하고, 이를 SQL 쿼리에서 쉽게 필터링하기 위해서이고, 비트마스크를 사용하면 여러 가지 조건을 하나의 필드로 관리할 수 있으며, 데이터베이스에서 복잡한 조건을 효율적으로 조회할 수 있다. 비트마스크 사용의 주요 이유1. 상태 관리의 효율성여러 상태나 옵션을 하나의 정수 값에 저장할 수 있다. 예를 들어, 사용자의 권한을 비트마스크로 관리하면, 권한 정보를 단일 열로 관리할 수 있다. 2. 간결한 쿼리비트마스크를 사용하면 복잡한 조건을 간단한 비트 연산으로 표현할 수 있다. 여러 개의 OR 또는 AND 조건 대신, 비트 연산자를 사용해 단순한 조건으로 필터링할 수 있다. 3. 성능 최적화비트 연산은 매우 빠르며, ..
-
SpringBoot에서 QueryDSL 설정 및 사용Language/Java 2024. 8. 16. 16:57
1. 환경 설정1.1. Gradle 설정- build.gradle...// 프로젝트에서 사용하는 전역 변수를 설정ext { set('queryDslVersion', "5.0.0")}...dependencies { ... // QueryDSL implementation "com.querydsl:querydsl-jpa:${queryDslVersion}:jakarta" annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:ja..
-
SpringBoot에서 엑셀파일 암호화 후 내려받기Language/Java 2024. 6. 18. 17:30
개인정보가 들어간 엑셀 파일을 다운로드 하게 되면 보안 이슈가 발생 할수도 있으니 급하게 엑셀 다운로드 파일에 암호를 넣고 릴리즈 후 기록해 둔다. TestController@Tag(name = "test")@AppController(path = "/v1")@RequiredArgsConstructorpublic class TestController extends BaseController { ... @Operation(summary = "어쩌구 저쩌구 엑셀 다운로드", description = "") @GetMapping(value = "/tests/{testId}/comments/export") public ResponseEntity export(@PathVariable("testId") S..
-
Java Enum 적용Language/Java 2024. 1. 15. 11:01
레거시 코드 리팩토링을 진행하면서 상수 부분만 간단히 정리해 놓는다. 상수 public class Constants { public enum Client { GOBANG("10", "고방"), ALGO("20", "알고"), WESTAY("30", "위스테이"); private final String value; private final String text; Client(String value, String text) { this.value = value; this.text = text; } public String getValue() { return value; } public String getText() { return text; } public static Client findByValue(St..