자바

· TIL ✍️
문제CI/CD를 구성하면서, CD 마지막 과정은 EC2 서버의 기존 도커 컴포즈를 down 하고 다시 up 하는 과정이 있다. 그리고 재시작하면서 스프링 컨테이너를 강제 종료하는데, 이때 진행 중인 로직도 그대로 강제 종료되는 문제가 있었다. 예를 들어, 주문 처리 중 재고는 감소시켰는데 강제 종료가 되어서 재고가 롤백되지 않는 문제가 있을 수 있다. (MSA 환경이다)또한 Eureka server에 설정된 Eviction timer가 종료되기 전까지 유레카에 남게되는 문제도 있다.해결Graceful shutdown을 적용했다. 스프링 부트spring: application: name: payment-service config: import: classpath:application-data..
· TIL ✍️
문제토스페이먼츠 API를 이용하던 중, 응답으로 주던 날짜 형식 "2024-10-02T21:16:13+09:00" 이 LocalDateTime으로 파싱이 되지 않았다. 해결 OffsetDateTime을 이용해서 파싱 할 수 있었다.  1. LocalDateTime 파싱 에러 발생 @Test@DisplayName("LocalDateTime 파싱 - 에러남")public void testLocalDateTimeParseException() { // given String rawTime = "2024-10-02T21:16:13+09:00"; // when & then assertThatThrownBy(() -> LocalDateTime.parse(rawTime)) .isIns..
· TIL ✍️
문제간편결제를 구현하기 위해 6자리 숫자 비밀번호를 도입했다. 근데 평문으로 저장할 순 없으니 암호화를 해야 하는데, 스프링 시큐리티까지는 필요 없이 비밀번호 암호화만 하면 되었다. 해결 dependencies { // ... // spring security crypto implementation 'org.springframework.security:spring-security-crypto' // 여기 !!! // ...}spring-security-crypto 라이브러리를 의존한다. import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configur..
· TIL ✍️
문제결제 엔티티에서 결제 승인 메서드를 실행하면 결제 승인 시간에 자동으로 현재 시간으로 넣어준다. 자동으로 넣어준 LocalDateTIme을 어떻게 테스트할지 궁금했는데, 특정 시간과 가까운지 테스트하는 코드가 있었다.상황 /** * 결제 승인 */public void approve() { this.status = PaymentStatus.APPROVED; this.approvedAt = LocalDateTime.now(); // 여기 !!!}결제 승인 메서드 실행 시 approvedAt에 현재 시간을 넣어준다.해결 전체 테스트 코드import static org.assertj.core.api.Assertions.assertThat;// ... @Test@DisplayName("결제 성공")..
· TIL ✍️
요약eclipse-temurin:17-jre-alpine으로 이미지 굽자.상황어느날 문득, 서버에서 배포할 때 이미 빌드되어 jar 파일만 실행한다면, JDK가 아닌 JRE만 있어도 되는 거 아닌가? 하는 생각이 들었다.  요즘 배포할 때는 도커 이미지로 구워서 띄워버려서, JRE를 사용하면 용량을 더 줄일 수 있을 것 같아서 한번 알아봤다.  openjdk를 우선으로 찾아보았는데 내 서치 실력이 부족한 건지 17-jre만 있는 것은 찾을 수가 없어서, temurin으로 테스트해보았다.  예상대로 17-JDK (419.47 MB) > 17-JDK-alpine (335.97 MB) > 17-JRE (262.53 MB) > 17-JRE-alpine (185.34 MB) 순으로 용량이 줄어들었다. JDK에서 ..
· TIL ✍️
문제우리는 JPA 엔티티를 Ksuid라고 하는 고유 식별자를 사용하기로 했다. UUID 같은거다.  생성시간 기반의 20byte 고유 식별자로, 시간순으로 정렬이 가능해서 인덱싱의 이점을 누리면서도 랜덤값도 포함되어 중복 가능성이 거의 없으며, 길이도 짧다.  따라서 엔티티를 저장할 때 id를 넣어서 생성하도록 했다.  @Transactionalpublic S save(S entity) { Assert.notNull(entity, "Entity must not be null"); if (this.entityInformation.isNew(entity)) { this.entityManager.persist(entity); return entity; } else {..
· TIL ✍️
문제 스프링 부트에서 Record 클래스로 application.yml 파일 값 가져오려다가 에러가 났다. 상황// application.yml fruit: list: - name: banana color: yellow - name: apple color: red yml 파일에 fruit.list 속에 과일 리스트가 있는 형태를 스프링에서 가져다 쓰려고 했다.  // Fruit.classpublic record Fruit( String name, String color) {} // FruitList.classimport org.springframework.boot.context.properties.ConfigurationProperties;impor..
https://www.acmicpc.net/problem/1520  설명처음에는 BFS로 풀었다. 근데 BFS로 노드를 지나가면서 방문 체크를 해두는데, 이미 방문한 노드에 대해서는 이후 다른 경로에서는 거치지 않기 때문에 경로가 딱 1개만 나왔다. 그렇다고 지나간 경로를 체크 안 하면 무한 루프에 빠져서 BFS는 버렸다.  그 다음에는 DFS로 풀었다. 답은 나왔는데, 시간 초과가 떴다.  그래서 곰곰이 생각하다가 DP로 풀었더니 풀렸다.  탑다운 방식으로 풀었다.범위를 벗어나는 좌표에서는 0을 리턴하고, 이미 계산한 좌표에서는 그대로 계산 값을 리턴하고, 아직 계산하지 않는 좌표에 대해서는 현재 좌표의 상하좌우의 높이를 비교해서 현재 높이보다 큰 인접 좌표에 대해서 재귀로 dp를 호출했다.  stat..
https://www.acmicpc.net/problem/1202 맨 아래에 전체 코드 있다.   설명 처음에 배낭문제 인줄 알았는데 가방이 여러 개라 어떻게 풀지 고민하다가 가방에 1개의 보석만 담을 수 있어서 아닌 것 같았다(?)  일단 보석을 객체로 만들고, 가방 최대 무게 배열을 오름차순으로 정렬보석 리스트를 (1) 무게 오름차순, (2) 가격 내림차순 정렬 매 가방마다 보석 리스트 돌며 최대 무게 이하인 보석만 우선순위 큐에 넣기 (우선순위 큐는 2번과 같이 정렬됨)하나 poll 해와서 가격을 총 더하고, 더한 보석은 보석리스트에서 제거 출력  인줄 알았는데 시간 초과가 났다. 아무래도 보석과 가방 개수가 최대 30만개에, 이중 반복문이면 900억이어서..   그래서 풀이 봤다! 근데 풀이 설명..
yunjae62
'자바' 태그의 글 목록 (2 Page)