SearchDeveloper (81) 썸네일형 리스트형 [JPA] Querydsl 에서 Fetch Join 적용 안되는 이유 문제 상황 Fetch join 은 한 번의 쿼리로 JOIN 대상 테이블 데이터까지 한 번에 가져오고 영속성 컨텍스트에 넣어주기 때문에 n+1 문제를 해결하기 위한 하나의 방법이다. 그래서 fetch join 을 적용하면 실제로 그렇게 되는지 확인해보고 싶었다. Querydsl QBook book = QBook.book; QPaper paper = QPaper.paper; List bookList = jpaQueryFactory .selectFrom(book) .join(book).on(book.id.eq(paper.id)).fetchJoin() .fetch(); 생성된 SQL SELECT book.id FROM book INNER JOIN paper ON (book.id=paper.id) SELECT p.. [JPA] 영속성 컨텍스트(Persistence Context) : 엔티티 관리 공간 영속성 컨텍스트(Persistence Context) 엔티티를 관리하는 논리적인 공간이다. DB 와의 동기화를 위해 엔티티 변경 정보를 관리한다. 엔티티를 등록, 해제할 수 있어 그 상태를 관리하는 엔티티 생명주기가 존재한다. 엔티티 생명 주기 em.persist(member); 를 하면 Member 객체가 영속성 컨텍스트에 등록되어 commit 시 CRATE 쿼리로 변환해 실행하여 DB와 동기화를 한다. persist() 호출 전인 객체(비영속) 나 detached(준영속)나 removed(삭제) 된 엔티티는 아무리 setter로 데이터를 변경하거나 무슨 짓을 해도 DB 에 반영되지 않는다. 영속성 컨텍스트는 그 사실을 모르기 때문이다. flush(): 영속성 컨텍스트와 DB 를 동기화하는 메소드 쓰기.. Java 애플리케이션 메모리 누수(Memory leak) 잡기 - jstat, MAT 결론 💥 건 수 많은 데이터 처리할 때 Nested Map 사용 주의! 1. 작업 내용 File To MongoDB 애플리케이션을 개발해야 한다. raw 파일 데이터에서 “idx” 필드를 KEY 로 잡아 그룹핑 후 “seq” 순으로 “item”값을 연속으로 붙여 MonoDB 에 적재하는 작업이다. raw 파일 데이터는 2GB에 1100만 건으로 건수가 굉장히 많은 형태라 속도 측면에서 걱정이 많았다. 그렇게 개발을 끝내고 애플리케이션을 실행했고.. application.log 2022-09-28 09:15:40.894 save start... 10000/2900873 2022-09-28 09:16:05.654 total count: [1507616] after saving // 25 초 ... 2022-.. Spring REST Docs 이해 Spring REST Docs 는 테스트 코드를 통해 API 명세서 작성을 도와주는 라이브러리이다. 필자는 빌드, 문서 작성 등 restdocs 의 전반적인 이해가 어려워 관련 강의를 들은 지 1년 만에 두 번째 시도 끝에 실무에 적용할 수 있게 되었다. (감격..😭) 먼저 최종 산출물을 확인하고 빌드하는 법, 문서 작성하는 법 순으로 설명해보고자 한다. 기술 스택 spring boot 2.7.3 gradle 7.5 java 11 JUnit5 ① 최종 산출물 - API 명세서 (index.html) http://127.0.0.1:8080/esonline/docs/index.html 이것이 최종 API 명세서인 index.html 이다. 문서를 파일이나 타 프로그램에서 관리하는 게 아닌 API URL 로 .. HTTP 개요 리소스 클라가 아닌 웹 서버에 존재하는 어떤 종류의 컨텐츠이다. 정적 리소스인 html 이 될 수도있고 동적 컨텐츠도 포함된다. MIME (Multipurpose Internet Mail Extensions) http를 통해 전송되는 객체 데이터는 텍스트가 될 수도있고 이미지가 될 수도 있고 영상이 될수도 있다. 데이터가 어떤 종류인지 MIME 타입을 통해 명시한다. MIME 에 메일이 붙은 이유는 초기에 MIME 은 다양한 전자메일 시스템 간에 메시지 통신할 때 사용하는 타입이었는데 HTTP 에서도 잘 동작하여 MIME 타입을 채택하였다. 웹서버가 메시지에 MIME type 을 붙여 클라한테 반환하면 클라는 MIME 을 먼저 까보고 다룰 수 있는 메시지인지 판단한다. MIME 에 맞게 데이터를 파싱해 .. ElasticSearch Full GC 해결 과정 8월 3째주 세상이 멈췄다 엘라스틱서치를 사용하는 서비스 API 에서 간헐적으로 circuit breaker 가 오픈됐다. circuit breaker 가 오픈되는 이유 중에 하나는 API 반환이 제 시간에 되지 못했다는 것이다. 그 시간대에 엘라스틱서치에 무슨 일이 있었나 키바나로 확인해 보니 세상에나! Full gc 수행시간이 600 ms 가량 치솟았다. 한 번만 발생한 거라면 살짝 넘어갔겠지만.. 간헐적으로 발생하고 있었기에 조치가 필요했다. 여러 대안이 있었고 그 때 당시 Heap 메모리 사용량이 90% 에 육박했기에 메모리를 30% 가량 증설하였다. ♣ 노드 하나당 힙 메모리: 24G → 32G 8월 4째주 해결된 듯 했으나 메모리 증설 후 며칠동안 상황을 지켜봤는데 이런.. Full GC 가 .. 스프링부트 jar 구성 및 실행 원리 maven이나 gradle 같은 빌드 툴로 스프링부트 프로젝트를 빌드하면 하나의 산출물인 jar 파일이 생성된다. 이 jar의 구성은 어떻게 되어있는지, java -jar app.jar 를 하면 application이 어떻게 실행되는지 알아보겠다. 1. jar 의 구성 요소 먼저 아주 아주 간단한 프로젝트를 생성한다. 그리고 gradle의 bootJar task 를 실행하면 build/libs 폴더에 jar 가 하나 생성된다. 이 jar 는 “스프링부트” 가 “우리가 개발한 소스 코드”를 실행하는데 필요한 모든 것을 가지고 있다. jarAnalysis.jar ㄴ BOOT-INF ㄴ META-INF ㄴ org root 폴더 기준으로 하나씩 알아보자 ① BOOT-INF : “우리가 개발한 소스 코드” 영역 .. ElasticSearch BM25 이해하기 다음 3개의 문서가 있다. [문서 1] 눈을 떠보니 커피 없는 세상에 와버렸다. [문서 2] 너도 커피 좋아해? 나도 커피 좋아해 [문서 3] 저기 저 앞에 커피 파는 가게가 있다. 한 번 가볼래? 그래 내가 쏠게 마시러 가보자 사용자가 “커피” 를 검색한다. 당신은 검색엔진이고 “커피” 와 가장 관련있는 순으로 검색 결과를 내보내야한다면 문서 순위를 어떻게 지정할 것인가? 만약 2, 1, 3 순이라고 답했다면 축하한다! 당신은 BM25를 이해했다. 날짜, 불리언 같은 간단한 필드를 검색할 때는 답이 정확이 존재하기 때문에 정답 문서를 찾는 것이 명확하다. 하지만 책, 뉴스 기사, 공고 내용 같은 full-text 로 구성된 필드를 검색하는 것은 비교적 명확하지 않다. 왜냐하면 full-text 검색은 .. Spring Data Mongo save 시 DuplicateKeyException 나는 이유 및 해결 Spring Boot 에서 MongoDB 에 접근하기 위해 ORM을 지원하는 Spring Data MongoDB 라이브러리를 사용하였다. implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' 에러내용 MongoDB 도큐먼트와 중복된 _id 를 가진 DTO 를 넣기 위해 repository의 save 메소드를 실행했다. public interface CollectionRepository extends MongoRepository { } CollectionDto collectionDto = new CollectionDto(); // fill in dto collectionRepository.save(collectionDto); .. TestContainers 설명 이 글은 온라인 강의를 듣고 해당 내용을 직접 실습해보며 정리한 글입니다. 더 자세한 내용은 아래 강의에서 확인할 수 있습니다. 더 자바, 애플리케이션을 테스트하는 다양한 방법 - 인프런 | 강의(백기선) 테스트에서 도커 컨테이너를 실행할 수 있는 라이브러리 테스트 실행시 DB를 설정하거나 별도의 프로그램 또는 스크립트를 실행할 필요 없다. 보다 Production에 가까운 테스트를 만들 수 있다. 테스트가 느려진다. https://www.testcontainers.org/ → 테스트컨테이너를 쓰면 테스트용 도커를 만들 필요도, 손수 띄우고 내릴 필요도 없다. 설치하기 디펜던시 org.testcontainers junit-jupiter 1.15.1 test junit-jupiter를 지원하는 test.. 이전 1 ··· 4 5 6 7 8 9 다음