본문 바로가기

SearchDeveloper/SpringBoot

(9)
로그에 클래스, 메소드명 자동 출력하기 언어: JAVALogging Framework: logback팀 컨벤션 혹은 원활할 디버깅을 위해 로그에 클래스명과 메소드명을 출력하는 경우가 있다.가장 쉬운 방법은 로그에 하드코딩으로 집어넣는 방법일 것이다.log.info("[Class][Method] Message occurred.")하지만 클래스, 메소드명이 바뀔 때마다 수동으로 챙겨줘야하는 불편함이 있다.그래서 클래스, 메소드명을 자동으로 출력할 수 있는 2가지 방법을 소개한다.log.info("method called");2024-06-22 18:07:53.409 INFO 7905 --- [ main] d.h.s.methodlog.MethodLogService : [MethodLogService][log] method called① 애노테이션으..
[JPA] QueryDSL stream DB connection 에러 해결 과정 ② - @Transactional 버전 Spring Boot 2.7.4 QueryDSL 5.0.0 MySQL 5.7 이전 글 https://elsboo.tistory.com/40 [JPA] QueryDSL stream DB connection 에러 해결 과정 ① 버전 Spring Boot 2.7.4 QueryDSL 5.0.0 MySQL 5.7 DB 데이터를 가공해 카프카로 전송하는 애플리케이션을 만들면서 약 1주간 많은 난관에 봉착했고 많은 삽질을 했다. 어떤 에러가 있었고 어떻게 해결하였는 elsboo.tistory.com ② stream 데이터 사용 좀 해보려는데 forEach() 에서 Operation not allowed after ResultSet closed 에러… 결론 @Transactional 가 붙은 메소드는 메소드 종료..
[JPA] QueryDSL stream DB connection 에러 해결 과정 ① 버전 Spring Boot 2.7.4 QueryDSL 5.0.0 MySQL 5.7 DB 데이터를 가공해 카프카로 전송하는 애플리케이션을 만들면서 약 1주간 많은 난관에 봉착했고 많은 삽질을 했다. 어떤 에러가 있었고 어떻게 해결하였는지에 대해 공유하고자 한다. ① stream() 으로 레코드 한 건씩 가져오는 건 줄 알았는데 왜 타임아웃이 나지!? 결론 .fetch().stream() 는 Java의 스트림, .stream() 은 DB의 스트리밍 방식이다! 에러 현상 쿼리 호출 대상인 tableA 테이블은 몇 십 만건의 데이터를 가지고 있다. 그래서 데이터를 한꺼번에 들고 오면 타임아웃이 나거나 메모리가 터질 수 있으므로 스트리밍 방식을 적용해 한 건씩 처리하기 위해 다음과 같이 구현을 하였다. publi..
[JPA] Multi Datasource 설정하기 Spring Data Jpa 에서 한 개의 DB만 사용한다면 application.yml 만 설정해도 auto configuration 을 통해 자동으로 DB 커넥션이 생성된다. 하지만 한 프로젝트에 접근할 DB가 2개 이상이라면? 혹은 다른 DB 서버도 접근해야한다면? 귀찮지만 Configuration 클래스를 생성 해줘야한다. ※ 참고 single datasource 일때 application.yml 설정을 참고하면 좋을 듯하다. application.yml spring: datasource: url: jdbc:h2:tcp://localhost/~/member username: sa password: hikari: idle-timeout: 0 maximum-pool-size: 1 jpa: databa..
[JPA] Querydsl 시작하기 Querydsl 이란? JPQL 생성을 도와주는 라이브러리이다. Querydsl 메소드를 사용해 작성한 쿼리는 JPQL 로 변환되어 SQL 쿼리가 실행된다. 사용하는 이유 쿼리 메소드는 메소드명만으로 하이버네이트가 SQL로 변환해주기 때문에 간단하게 사용할 때는 너무나 강력하다. 하지만 join 을 쓰거나 쿼리가 복잡해지면 JPQL 로도 결국 SQL 쿼리 짜듯이 문자열로 작성하는 수 밖에 없다. 하지만 Querydsl 를 사용하면 여전히 메소드를 활용해 쿼리를 생성하는 것이 가능하다. @Query 애노테이션으로 JPQL을 짜면 syntax error를 애플리케이션 실행을 해봐야 알 수 있다. 하지만 Querydsl를 사용하면 메소드와 변수로 쿼리를 만들기 때문에 애초에 syntax error 나기가 힘들..
[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..
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 로 ..
스프링부트 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 : “우리가 개발한 소스 코드” 영역 ..
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); ..