개발 관련/Spring

[Spring Batch] - Job, Tasklet Step, Chunk Step 개념
Job - 순서를 가진 여러 Step의 목록 또는 모음 - 외부 의존성에 영향을 받지 않고 실행되는 독립적인 작업 Step - 배치처리를 정의하고 제어하는 독립된 작업의 단위 1. Tasklet Step - 간단히 정의한 하나의 작업처리 2. Chunk Step - 한번에 하나씩 데이터를 읽고 chunk를 만든 후 chunk 단위로 트랜잭션을 처리
[Spring Data JPA & Querydsl] - QuerydslPredicateExecutor 사용시 javax.persistence.noresultexception 오류 원인
spring data jpa querydsl spring boot 3.x.x hal-explorer 을 이용하여 개발시 오류에 대해서 기록 JpaRepository, QuerydslPredicateExecutor를 다중으로 상속받은 인터페이스를 이용해서 api를 호출했는데, javax.persistence.noresultexception 오류가 발생. 딱히 문제에 대한 기록도 없고 컴파일 오류도 없기 때문에 멘붕이 왔다. 우선 원인은 3.0 이상 버전을 사용했기 때문에 gradle에 의존성 추가한 디펜던시들이 참고했던 예제와 달라서 발생했다. 2 버전대로 낮추니jakarta를 참조했던 라이브러리들을 모두 javax.persistence로 수정. 또한 스프링 버전에 맞게 각각 라이브러리의 버전을 맞추니 해..
[Spring Data JPA] @Modifying과 @Query를 이용한 벌크 연산
지난번에는 QueryDSL에서 벌크연산을 위한 글을 작성했는데, 이번에는 JPQL에서 벌크연산을 위해서 기록을 남기기 위해 작성하려고 한다. @Modifying @Query 어노테이션을 이용해서 JPQL을 사용할 때 @Query 어노테이션 위에 @Modifying 을 추가해야한다. 간단하게 데이터 처리할 때 유용하다. @Modifying에는 clearAutomatically, flushAutomatically 두개의 속성을 추가로 설정할 수 있다. clearAutomatically 이 속성을 true로 하면 @Query가 실행된 후 1차 캐시를 clear한다. 1차 캐시를 clear한다는 것은 영속성 컨텍스트에 데이터가 clear 된다는 것이고 그렇게되면 DB의 쿼리가 추가로 발생하게 된다. flushA..

[Spring Framework] - 제어의 역전 (IoC), 의존성 주입(DI) 과 OCP, DIP
최근 스프링 기초 개념부터 다시 차근차근 정리하는 중이다. 오늘은 제어의 역전 (IoC)의 개념을 좀더 명확히 하려고 한다. 제어의 역전을 왜할까? 제어의 역전은 객체나 메서드의 호출을 개발자가 직접 결정하는게 아니라, 외부에서 결정하는 것을 의미한다. 다른 블로그를 찾아보면 프레임워크와 라이브러리의 차이를 예로 들어 설명하거나, 바로 위의 설명처럼 개발자가 아닌 스프링 컨테이너(외부)가 결정한다고 설명한다. 하지만 나는 왜? 라는 의문이 계속 생겨 좀처럼 와닿지가 않았다. '그래서 왜 외부에서 결정하는건데...??' 김영한님의 [스프링 핵심 원리 - 기본편]의 강의 중 [IoC, DI, 그리고 컨테이너] 영상을 보아도 '왜?' 라는 의문이 사라지지 않았는데, 같은 강의 초반 부분 [좋은 객체 지향 설계..
[JPA] - 영속성 컨텍스트에 대해
JPA를 공부하면 항상 따라오는 용어가 있다. 영속성 컨텍스트. Entity를 영구 저장하는 환경이라는 뜻이라고 한다. EntityManger.persist(entity); 위와 같이 영속성 컨텍스트에 entity를 insert 한다. Entity의 생명주기 - 비영속(new/transient): 영속성과 전혀 관계가 없는 새로운 상태 - 영속(managed): 영속성 컨텍스트에 관리되는 상태 - 준영속(detached): 역속성 컨텍스트에 저장되었다가 분리된 상태 - 삭제(removed): 삭제된 상태 1. 비영속 - 객체를 생성했지만 persist를 하지 않아 영속성 컨텍스트에는 관리되지 않는다. - 예: Member member = new Member("MAN"); 2. 영속 - 생성된 객체를 pe..

[Spring Boot] 배포시 오류: java.lang.NoClassDefFoundError
Spring Boot로 개발을 하다가 로컬에서 빌드해서 API 호출하면 잘 되는데... 이상하게 배포할 때만 java.lang.NoClassDefFoundError 오류가 발생한다. 이걸로 몇 시간을... 삽질했는데... 다른 사람들은 classpath나 프로젝트에 참조등 다양하게 해결했는데 나같은 경우는 너무 간단하다.... //파일 관련 implementation group: 'commons-io', name: 'commons-io', version: '2.11.0' 저기 implementation를... compileOnly로 했기 때문.... 웹에서 긁어와 그대로 복사&붙여넣기 했더니 저기 볼 생각은 안했다. complieOnly이기 때문에 jar로 빌드시에 참조가 제대로 안되었던 것 같다. 지금..

[Spring Boot & Docker] Docker 빌드 오류: ERROR [2/2] COPY ..
spring boot로 배포를 Docker로 하기 위해 빌드하는 도중 오류가 발생했다. 아래는 빌드하기 위한 Dockerfile FROM openjdk:8 ARG JAR_FILE=build/libs/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"] 두번의 오류가 발생했는데, 1. openjdk:8 문구 오류 예전에 기록했던 내용은 FROM openjdk:8-jdk-alpine 이었지만... 8 뒤의 -jdk-alpine로 오류가 발생. 지우고 다시 빌드하니 조금 되는가 싶더니 다시 오류 발생. 2. JAR_FILE 경로 오류 두번째는 jar 파일의 경로 오류. 프로젝트에는 각각의 jar 파일 빌드시 생성되는 경로가 있는데 예전에는 ..

[Spring Boot] 파일 업로드시 톰캣 경로가 나오는 경우
현재 내가 테스트 중인 개발 환경은 Backend와 Frontend를 분리한 상태이다. Backend에서 파일업로드 API 생성하여 Frontend에서 API를 호출하여 파일 업로드 처리를 하려는데, 이상하게 계속 Tomcat의 모든 경로가 노출된 경로에서 이후 yml 파일에 설정한 path 경로가 이어지게 된다. 예: C:\\Users\\hanks\\AppData\\Local\\Temp\\tomcat.80.15101316688673606216\\work\\Tomcat\\localhost\\ROOT\\uploads\\yLgPrNWG5w.jpg (uploads가 내가 yml 파일에 설정한 경로) 원인은 yml파일에 경로를 잘못 입력해서...윈도우일 경우 yml 파일의 path에 절대 경로로 입력해줬더니 해..