JAVA/JAVA 기초2025. 6. 26. 19:48[JAVA/기초] LineNumberReader + 1 문제

JDK 8을 JDK 17로 마이그레이션 하는중 생긴 문제이다.LineNumberReader lnr = new LineNumberReader(new FileReader(file));lnr.skip(Long.MAX_VALUE);int lineCount = lnr.getLineNumber();targetCnt = prevTargetCount + lnr.getLineNumber() - lineToSkipCount + 1;파일 끝까지 쭉 스킵하고 라인 수를 가져오는 로직이다.JDK 8 시절에는 +1 보정을 넣어서 타겟 수를 계산했다.근데 마이그레이션 이후 같은 로직인데 값이 달라지기 시작했다.문제의 주범https://bugs.java.com/bugdatabase/view_bug?bug_id=JDK-8230342H..

Spring/Spring 기초2025. 6. 19. 00:36[Spring/기초] 외부 Api를 호출해서 서버 날리기 (외부 Api 호출 위험성 낮추기)

그냥 예외처리만 잘했는데요?좋아 그럼 너의 서버는 외부 api장애시 thread pool을 전부다 소모해버릴 것이다.외부 Api 호출시 생길수 있는 문제는 다음과 같다.타임아웃 미설정 - 외부 Api가 느려도 응답을 기다리며 스레드 점유벌크헤드 없음 - 외부 Api호출이 하나의 공유 스레드풀, 리소스풀을 사용해 장애가 전파됨서킷 브레이커 없음 - 실패가 연속해서 발생해도 계속 api를 호출함Retry 백오프 없음 - 일시적인 장애인데도 retry를 짧은 시간동안 계속 반복멱등성 없음 - 재시도 요청이 중복처리됨그럼 이제 이들의 자세한 원인 해결 법을 알아보자타임 아웃 미설정서블릿 서버의 경우 1요청 1스레드를 점유하게된다. 이때 wait time 설정이없어서 무한정 대기한다면 금방 스레드 풀이 소모될 것..

[Spring/기초] Pageable 자주 사용하지만 관심은 없었던 그 녀석
JAVA/JAVA 기초2025. 6. 12. 19:47[Spring/기초] Pageable 자주 사용하지만 관심은 없었던 그 녀석

Paging된 데이터를 만드는 컨트롤러 사용하다보면 Pageable객체를 자주 사용하게 된다.@GetMapping("/users")public Page getUsers(Pageable pageable)그냥 이렇게만 써도, 프론트에서 ?page=0&size=10&sort=name,desc 이런 식으로 요청 보내면정상적으로 10개씩 name 기준 내림차순으로 잘린 리스트가 반환된다.근데 Pageable은 인터페이스이다. 우리는 new도 안했고 객체 생성도 안했는데 이건 어디서 구현체를 받아오는걸까? Pageable & PageRequest Pageable은 인터페이스 진짜 일하는 녀석은 PageRequest이다.Pageable pageable = PageRequest.of(0, 10, Sort.by("nam..

Spring/JPA2025. 6. 12. 18:59[Spring/JPA] JPA ID 생성 전략

JPA에서 Id 생성하기jpa를 사용해서 entity를 만들다보면 @Id 어노테이션을 사용하게된다. 이때 db에 id생성 방식을 잘 만들었다면 자동할당이 되서 신경쓰지 않아도돠나 직접할당을 사용하려면 @GeneratedValue를 사용해서 stretagy 옵션을 사용해서 설정할수 있다. 여기올수있는 값의 코드는 다음처럼 생겼다.Enum값으로 4가지가 있다@Target({ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface GeneratedValue { GenerationType strategy() default GenerationType.AUTO; String gen..

[Database/기초] Index 저장 자료구조와 복합키 저장 방식
Database/Database 기초2025. 6. 9. 21:26[Database/기초] Index 저장 자료구조와 복합키 저장 방식

DB 에서 사용하는 자료구조는?DB들은 기본적으로 B+tree를 사용한다B-tree자료구조 설명이진 탐색트리를 개선한 자료구조이다기본적으로 모든 leaf노드가 동일한 level에 있다. 또한 부모노드(내부노드)도 key값과 value값을 가지고있는다. (최악 시간복잡도가 log(n)으로 동일하게 보장된다는 뜻이다.즉 최소 시간 = 최악 시간이 항상 보장되는것이 아니다)따라서 leaf노드까지 탐색을 진행하지 않고 탐색이 끝날수도있다.2개이상의 자식을 가질수도 있다.부모노드가 N개를 값을 가지고있다면 자식노드는 최대 N+1개의 노드를 가지고있을 수 있다범위 탐색A이상B이하 범위탐색을 진행해야 할시 A값을 찾으려 부모노드부터 자식까지 탐색(분기 탐색) 1회 B값을 찾으려 부모노드부터 자식 노드까지 탐색 총 2..

[공부 시간 기록/개발일지] (3) DTO, VO, ??? 그럼 DDD끼리 데이터 교환은? 아니 그전에 동기 비동기가 뭔지부터 알아야지
Project : 공부 시간 기록/개발일지2025. 4. 17. 22:52[공부 시간 기록/개발일지] (3) DTO, VO, ??? 그럼 DDD끼리 데이터 교환은? 아니 그전에 동기 비동기가 뭔지부터 알아야지

1. 이번엔 또 뭔데?앞서서 나는 WakaTime에서 access토큰을 받아오고 저장하는 모듈을 만들었다. 이모듈은 access토큰을 받아오고 저장하는 단일 기능역할을 수행할 것임으로 access토큰을 사용해서 사용자의 데이터를 저장하는 모듈을 다른 모듈이 될것이다.자 그럼 이런 방식에서 고민해야하는것이 뭘까? 그럼 뿌려주는 방식이 뭘까? 라는 물음에서 시작됐다.(DB설계는 다했는데 이거 고민하느라 데이터 저장은 시작도 못한것은 비밀)2. 아직 통신방식은 안정했다. 물론 넘겨줄 데이터 형식도 안정했다. 통신방식은 아직 정하지 않았다. 이유는? 어떤 객체? 데이터 형식?을 넘겨줄지 정하지 않았는데 무작정 통신 방식을 정한다? 이것도좀그렇고.. 그래서 같이 비교해보려고한다. 어떤 통신법에서 어떤 방식으로 넘..

728x90
image