본문 바로가기

전체 글236

[JPA] JPA batch insert가 다건을 한 번에 지정해도 row마다 insert가 발생하는 건 해결방안 A db에서 데이터를 가져와 B db에 넣는 배치 작업을 수행할 때 두가지 문제 발생 문제1. insert 하기 전에 select가 실행됨 문제2. repository.saveAll(List) 을 통해 다량의 데이터를 넣는데, 멀티 insert가 되지 않고 행별로 insert가 됨 (십만 개를 넣으면 10만번 select, insert 가 수행되는 상황) select 되는 원인 분석 여러 fk의 조합으로 pk가 되어 있는데, 이 경우 이미 key값이 정해진 것으로 판단하여 insert할 때 update를 해야하는지 확인하는 로직이 존재. 그래서 아래 구문에서 isNew()가 false가 되어 merge가 수행되면서 발생한다. @Transactional @Override public S save(S ent.. 2022. 9. 26.
[JPA] intellij에서 Entity column명에 cannot resolve column 이 뜨고 링크가 안될 때 현상 이렇게 링크가 되지 않고 에러 상태로 표기된다. 실제 실행에는 문제가 없으나 신경쓰인다. 해결방법 View > Tool Windows > Persistence 클릭하면 좌측 프로젝트 부분에 Persistence 메뉴가 열린다. 프로젝트 메뉴에 오른쪽 마우스 클릭 후, Assign Data Sources 클릭 entityManagerFactory에 Select data source에 알맞은 database 소스를 선택해준다. 사라진 것을 확인할 수 있다. 링크도 정상적으로 걸린다. 2022. 8. 5.
[JPA] @Query annotaion 으로 직접 쿼리 작성 너무 잘되어 있는 포스트가 있어 아래에 전체 링크함. 필요한 케이스는 다 들어가있는 듯. 요약 @Query 어노테이션을 달고 일반 SQL 및 JPQL로 쿼리를 작성할 수 있다. JPQL은 JPA에서 지원하는 객체지향 쿼리 언어이다. 테이블 명 등으로 작성하는 일반 sql과 달리 JPA에서 생성한 Entity 등으로 참조한다. 함수명은 일반 JPA처럼 결정되어 있는 것이 아니라 임의작성가능(길이를 줄일 수 있다!!! 망할 JPA!!!) 기본값은 JPQL로 작성가능하고 일반 SQL로 작성하려면 옵션(nativeQuery = true, default false)을 바꿔야한다. @Query(nativeQuery = true) 예제 select * from user where id='test01' 이 문구를 적용.. 2022. 8. 4.
[querydsl] 하나의 entity를 여러번 join하고 싶을 때 QClass로 querydsl을 작성하다가 하나의 entity(테이블)을 여러번 join하는 등, n번 사용하고 싶을 때가 있다. 그럴 때, QClass에는 생성 시 variable을 지정해서 사용해야 한다. 아래처럼 서로 다른 이름을 지정한다. QPpApl ppApl = new QPpApl("ppApl"); QPpApl ppApl2 = new QPpApl("ppApl2"); QUsr usr = new QUsr("usr"); QUsr usr2 = new QUsr("usr2"); 그런데! 주의사항이 있다. 같은 entity간 중요한 것이 아니다. query를 작성하는 모든 곳에서 유일한 값이어야 한다. 즉, 저 4개의 QClass에서 서로 겹치는게 발생하면 query 수행 시 문제가 발생할 수 있다. 아.. 2022. 8. 1.
querydsl에서 Tuple 혹은 DTO로 데이터 받기 querydsl에서 보통 entity로 선언된 클래스의 변환 클래스인 QClass로 데이터를 받게 되나, DTO로 받을 수 있다. 기본적으로 Tuple로 받아서 개발자가 알아서 꺼내 쓸 수도 있겠으나, 좋은 방법이 아님에는 분명하다. DTO로 받는 방법에는 3가지가 있다. Property 접근(setter, getter) List result = queryFactory .select(Projections.bean(MemberDto.class, member.username, member.age)) .from(member) .fetch(); 필드에 직접 접근 List result = queryFactory .select(Projections.fields(MemberDto.class, member.userna.. 2022. 7. 30.
Blocking, Non-blocking, Sync, Async 의 차이 블로킹 Blocking A 함수가 B 함수를 호출 할 때, B 함수가 자신의 작업이 종료되기 전까지 A 함수에게 제어권을 돌려주지 않는 것 논블로킹 Non-blocking A 함수가 B 함수를 호출 할 때, B 함수가 제어권을 바로 A 함수에게 넘겨주면서, A 함수가 다른 일을 할 수 있도록 하는 것. 동기 Synchronous A 함수가 B 함수를 호출 할 때, B 함수의 결과를 A 함수가 처리하는 것. 비동기 Asynchronous A 함수가 B 함수를 호출 할 때, B 함수의 결과를 B 함수가 처리하는 것. (callback) 가장 헷갈릴만한, 논블로킹인데 동기/비동기 케이스의 경우는 A는 B가 처리하는 동안 본인의 작업을 수행할 수 있다는 점은 같지만 동기에서는 B함수를 A가 처리해야 하므로 B에.. 2022. 7. 26.
Springboot에서 커스텀 필터 추가 방법 Filter를 구현하고 @Component 어노테이션을 붙여 등록한다. import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class MyFilter implements Filter { @Override public void doFilter(ServletRequest request, Servle.. 2022. 7. 20.
OncePerRequestFilter와 Filter의 차이 요약 Filter 를 구현하여 Spring에서 커스텀 필터를 만드는 부분은 넘어가고, GenericFilterBean 이라는 추상클래스를 스프링에서 제공한다. 이것은 스프링의 설정들을 가져다 쓸 수 있거나 set도 할 수 있도록 구성되어 있다. public abstract class GenericFilterBean implements Filter, BeanNameAware, EnvironmentAware, EnvironmentCapable, ServletContextAware, InitializingBean, DisposableBean { } 두 개의 공통점은 매 서블릿마다 호출된다는 점인데, 문제는 서블릿에서 다른 서블릿으로 이동할 때 다시 필터체인을 거치면서 두 번 호출되는 경우가 있다는 점이다. 그.. 2022. 7. 20.
CORS(Cross Origin Resource Sharing) 요약 직역하자면 교차 출처 자원 공유. 사용되는 의미는, 출처가 다른 자원에 대한 공유를 허용하는 [규칙]이다. CORS 규칙을 지키지 않은 요청에 대해서 막겠다는 의미. 출처라고 하면 스킴과 호스트, 포트를 의미한다. 예를 들면 https://naver.com:8080 이다. 이 경우 https 스킴에 naver.com 호스트이며 8080 포트로 들어온 요청만 받는다는 SOP(Same Origin Policy) 규칙에서 예외 조항을 설정한다면 그게 CORS 규칙이 될 것이다. 출처를 비교하는 스펙은 기본적으로 브라우저 스펙이다. 요청이 들어오면 서버로 요청하여 응답을 받고 출처를 비교해 SOP를 어겼다면 리젝한다. 브라우저를 통하지 않은 요청을 당연히 비교하지 않는다. CORS 동작 방식 http요청을.. 2022. 7. 9.