본문 바로가기

Develop/Spring47

Spring Boot 프로젝트에서 환경에 따라 다른 Profile 등록하기 하이... 오늘은 실무에서 일하시는 분들이라면 알면 좋은 내용에 대해 작성해보려고 한다. 혼자 개발하는 개발자라면 상관없겠지만, 실무에서는 보통 로컬 환경, 개발 환경, 테스트 환경 , 운영 환경 다양한 환경에서 프로젝트를 수행한다. Spring Boot 를 이용하는 개발자들이라면 다들 아시겠지만 application.yml 파일에 설정을 별도로 해주어 이런 환경 구분이 가능하다. 일단 test 전용으로 yml 파일도 하나 복사해서 만들어주자. 그리고 내부에 test > resources 디렉토리에 있는 yml 에는 ````` spring: profiles: active: test ````` 를 추가해주고, main > resources 에는 ````` spring: profiles: active: lo.. 2021. 7. 9.
[querydsl] batch 성 거래 처리하기 프로그램을 짜다보면 배치작업처럼 다량의 데이터가 업데이트 되거나 삭제되야하는 경우가 있다. 그런데 querydsl로 update 쿼리를 날리면 db의 상태와 영속성 컨택스트의 상태가 다른것을 확인할 수 있다. 영속성 컨택스트의 데이터는 그대로고 db만 값이 변경된다. 영속성 컨택스트의 1차 캐시와 동기화가 안되었기 때문이다. (JPA에서는 이를 Dirty Checking) 이라고 한다. 그래서 혹시나 내부에서 로직이 update이외에 다른게 있다면 꼭 영속성 컨택스트를 초기화 하는 과정을 넣어주는게 좋다. long updateCnt = queryFactory .update(member) .set(member.userName, "babo") .set(member.age, member.age.add(1)) .. 2021. 7. 8.
[querydsl] 동적 쿼리 만들기 mybatis는 특정한 xml에서 sql을 처리하고, 거기서 또 동적 쿼리를 처리한다. 이게 생각보다 나는 많이 불편했다. querydsl은 java 코드 내에서 동적 쿼리 처리가 가능하다. 이는 큰 이점이라고 생각한다. 오늘은 querydsl에서 동적쿼리를 처리하는 두가지 방법에 대해 작성해보려고한다. 1.BooleanBuilder 이 방법은 QueryDSL에서 공식적으로 문서로 남겨져 있는 방식인데 null인지 아닌지를 판별하여 builder를 조립해서 끼워 넣는 방식으로 작업을 한다. //BooleanBuilder builder = new BooleanBuilder(member.userName.eq(nameCond)); // 이런식으로 초기값 설정 가능 BooleanBuilder builder = .. 2021. 7. 8.
[querydsl] querydsl에서 projection 다루기 db를 다루다 보면 종종 projection을 다뤄야할 때가 있다. 혹시나 Projection이 무엇인지를 잘 모르는 분들을 위해 간단하게 Projection의 개념에 대해 정리를 해두겠다. Projection 연산 - 한 Relation의 Attribute들의 부분 집합을 구하는 연산자 - 결과로 생성되는 Relation은 스키마에 명시된 Attribute들만 가짐 - 결과 Relation은 기본 키가 아닌 Attribute 에 대해서만 중복된 tuple들이 존재할수 있음 대충 이런건데.. 이를 querydsl에서도 구현할 수 있다. 만약에 Projection의 대상이 하나인 경우에는 그냥 쉽게 아래 예제처럼 하면된다. List result = queryFactory .select(member.user.. 2021. 7. 7.
[querydsl] concat 사용법 (문자열 붙이기) 오늘은 querydsl 을 사용할때 concat 메서드를 이용해서 문자열을 붙이는 방법을 정리해 둘 예정이다. 1. concat concat을 이용해서 문자열을 이어 붙일수도 있다. String 이외의 요소를 이어 붙일 경우에는 해당 요소를 String으로 바꿔주어야 하기에 stringVaule 메서드를 이용해줘야한다. 이 stringValue 메서드는 나중에 enum 타입을 String으로 바꿀때도 유용하니 잘 정리해두고 기억해두면 좋을 것같다. 아래 예시를 보고 각자에 맞게 잘 응용해서 사용하면 될듯하다. String member = queryFactory .select(QMember.member.userName.concat("&").concat(QMember.member.age.stringValue.. 2021. 7. 7.
[querydsl] querydsl 에서 서브쿼리 사용하는 법 하이 .. 오늘은 querydsl에서 서브쿼리를 사용하는 방법을 정리해 두려고 한다. 1. where 절 서브 쿼리 1) 기본 사용 법 기본적인 사용 방법을 아래 예제로 만들었다. 여기서 주의해야할 점은 Q 도메인을 서브 쿼리에서 사용할 놈은 따로 만들어 줘야한다는 것이다. 그리고 서브쿼리는 JPAExpressions라는 것을 이용해서 구현할 수 있는데, Q 도메인을 Static 처리한 것 처럼 이것 역시 처리가 가능하다. QMember subMember = new QMember("subMember"); List result = queryFactory .selectFrom(member) .where(member.age.eq( //JPAExpressions. select(subMember.age.min().. 2021. 7. 5.
[querydsl] queryDsl 기본 문법 정리 - 조인 ( inner join, theta join , on 절 사용, left outer join, right outer join, fetch join) 오늘은 간단하게 querydsl 에서 여러가지 join을 사용하는 방법을 정리해보고자 한다. 1. join (inner join) 먼저 가장 일반적인 inner join은 아래와 같이 사용하면 된다. 주석의 내용은 참고만 하길 바란다. List result = queryFactory .selectFrom(member) .join(member.team, team) // innerJoin 과 같음 //.rightJoin(member.team, team) // right outer join //.leftJoin(member.team, team) // left outer join .where(team.name.eq("a")) //.on(team.name.eq("a")) // 이것과 where 절은 결과가 같음... 2021. 7. 4.
JPQL vs QueryDSL 간단 비교 하이..! 최근에 QueryDSL 이라는 걸 알게 되었고 ... 이렇게 시간이 날때마다 틈틈이 정리해 두려고 한다. 오늘은 정말 간단하게 특정 데이터를 select 해오는 간단한 테스트 코드로 비교를 해봤다. 기본적인 QueryDSL 과 JPA 설정은 아래 링크를 참조하면된다. https://devkingdom.tistory.com/241 [queryDsl] QueryDsl 프로젝트 환경 세팅하기 보통 처음으로 SpringBoot 프로젝트를 만들때는, https://start.spring.io/ 여기서 필요한 라이브러리도 넣고 해서 기본적인 건 세팅을 해준다. 그런데.. queryDsl 은 저기서는 안되어서 내부적으로 build.gradle devkingdom.tistory.com @Test public.. 2021. 6. 30.
[querydsl] queryDsl 기본 문법 정리 - fetch, sort, paging, aggregation 오늘은 querydsl 기본적인 문법을 정리해 보도록 하겠다. 1. fetch fetch를 이용해서 querydsl 의 결과를 반환할수 있는데 여기서 여러가지 방법이 있다. 1) fetch() 리스트로 결과를 반환하는 방법이다. 만약에 데이터가 없으면 빈 리스트를 반환해준다. List fetch = queryFactory .selectFrom(member) .fetch(); 2) fetchOne() 단건을 조회할 때 사용한다. 결과가 없을때는 null 을 반환하고 결과가 둘 이상일 경우에는 NonUniqueResultException을 던진다. Member fetchOne = queryFactory .selectFrom(member) .fetch(); 3) fetchFirst() 처음의 한건을 가져오고 .. 2021. 6. 30.