본문 바로가기
관리자

Programming-[Backend]

(394)
[Querydsl] 5. 중급 문법 - 벌크연산, SQL function, 동적 검색 적용 API 개발해보기 1. 벌크연산 JPA 기본에서 JPQL문의 createQuery 뒤에 .executeUpdate() 구문을 넣어주면 벌크 연산이 가능하다고 배웠었다. 벌크 연산 후 em.flush, em.clear를 실행하거나 spring data jpa에서는 @Modifying을 적용해서 영속성 컨텍스트가 동기화되도록 만들어줘야 한다는 것도 배웠다. (https://whitepro.tistory.com/439) querydsl에서는 .execute()를 넣어주면 된다. 1 2 3 4 5 6 7 8 9 10 11 12 @Test public void bulkUpdate() { //28살 이하의 member1, member2의 이름이 "비회원"으로 변경 long count = jpaQueryFactory .update(m..
[TIL][링크] MapStruct 라이브러리 - @AfterMapping org.mapstruct 에서는 @AfterMapping 어노테이션을 지원한다. 해당 기능을 이용하면 데이터 전달 오브젝트인 DTO에서, 또는 DTO로 의 mapping이 일어난 후 어떤 메서드가 자동으로 실행되도록 할 수 있다. Mapper 클래스에서 @AfterMapping으로 mapping후 특정 메서드가 작동되도록 선언한다. 사용자로부터 입력받지 않은 값, 또는 서버에서 굳이 복잡한 로직을 거치지 않고 간단한 값을 클라이언트에 전달해주고 싶을 때 유용하게 사용할 수 있다. 예시코드 1 2 3 4 5 6 7 8 @Mapper(componentModel = "spring") public abstract class XxxPoToDtoMapper implements 제네릭으로 정의한 Mapper 인터페이..
[TIL][링크] messageSource application.yml 설정 옵션 지식 MessageSource와 관련된 설정들을 application.yml 파일에 작성할 수 있습니다. ( 참고 ) key 기본값 설명 spring.messages.always-use-message-format false MessasgeFormat을 전체 메시지에 적용할 것인지 여부 spring.messages.basename messages message 파일을 여러개 사용할 경우 콤마로 구분해서 여러개의 basename을 설정할 수 있다. spring.messages.cache-duration 캐시 주기 설정, 기본 값 forever spring.messages.encoding UTF-8 인코딩 방식 spring.messages.fallback-to-system-locale true 감지된 loca..
[Querydsl] 4. 중급 문법 - Projections, BooleanBuilder 1. 특정 DTO로 원하는 필드값만 가져오기 복습겸 JPQL로 원하는 필드값만 가져오는 것을 연습한다. MemberDto를 만들고 member.username, member.age 값을 가져와본다. 순수 JPA에서 JPQL로 Dto 조회 select 절에 new Operator를 사용해서 MemberDto를 가져올 수 있도록 작성한다. 특이한 점은 해당 Dto가 있는 패키지 위치를 전부 작성해야된다는 점이고, 타입은 MemberDto.class로 가져오면서도 from절은 Member 엔티티로 지정하고, MemberDto의 필드값도 이 엔티티 기반으로 m.username, m.age 로 작성해준다는 점이다. MemberDto.class 생성자가 반드시 있어야 한다. 1 2 3 4 5 6 7 @Data @A..
[Querydsl]3. 기본 문법 - 서브쿼리, Case, 상수 문자 더하기 1. 서브쿼리 서브 쿼리의 필요성과 SQL 사용 권장 사항 서브쿼리를 사용하면 SQL의 결과를 한 번에 깔끔하게 가져올 수 있다. 그러나 SQL로 모든 데이터를 한번에 가져오고, 깔끔하게 정리까지 할려는 것은 과한 측면이 있다. SQL문 하나에 모든 데이터를 가져오도록 하지말고, 작은 SQL문으로 쪼개어 애플리케이션이나 화면단에서 데이터를 합치자. 너무 방대한 쿼리문을 작성하는 것보다 여러 개의 의미있는 SQL문을 작성하는 것이 재사용성과 가독성을 높이는데 도움을 줄 수 있다. 다만, 성능이 매우 중요하고 실시간으로 데이터를 빠르게 받아와야 하는 경우에는 쿼리 횟수를 줄여서 성능을 확보하는 것이 중요할 수도 있다. raw 데이터를 가져오는 방식으로 SQL문을 작성해야한다. SQL문에서 제공하는 기본적인 ..
[Querydsl]2. 기본 문법 기본문법은 대부분 익숙한 내용이라, 몰랐던 부분이나 중요한 부분만 위주로 개조식으로 작성한다. Q객체 생성하기 Maven으로 Build를 하면 Q 객체를 생성해줬었는데, Gradle은 Build를 해도 Q객체를 생성하지 않는다. 이전 글에서 배운 것처럼 compileQuerydsl을 직접해줘서 Q객체를 생성해줘야 한다. 기본 문법 static import를 안해서 어색할 수 있다. Q객체의 alias를 "m"과 같이 설정하고, 해당 객체를 querydsl 문법으로 넘기는 방식을 적용함을 자각하고 있자. 이 alias는 querydsl이 JPQL을 작성할 때 sql문의 alias로 사용한다. 같은 Q객체를 동시에 조회해야할 때, Q 객체의 alias를 지정해서 사용해주면 된다! 똑같은 엔티티에서 다른 내용..
[Querydsl]1. 프로젝트 생성 및 예제 작성해보기 Querydsl 왜 쓸까? 1. 문법이 sql문과 거의 유사하기 때문에 배우기 쉽고 간결하다. 자바처럼 프로퍼티 탐색('.' 찍기)으로 문법 검색이 가능하다. 2. JPQL의 String으로 작성하는 sql문에 비해서, querydsl의 문법은 자바의 문법을 차용하기 때문에 Compile 시점에 미리 에러를 잡아준다. (전체 파일이 실행되기 전에 문제가 있으면 바로 알려준다.) 3. 검색 조건 등 복잡하고 동적인 쿼리를 가능하게 해준다. 물론 한계가 있어서 통계성 쿼리 등은 natvie 쿼리 등으로 해결해야한다. 1. 프로젝트 생성 및 환경 설정 스타터에 querydsl은 없다. 그림상에 있는 dependencies들만 추가하여 프로젝트를 생성한다. springBoot가 querydsl의 버전을 관리해주..
[TIL][링크] 트랜잭션의 전파, Spring @Transactional 중첩 참조 링크의 블로그에 너무 잘 정리되어 있어서 읽어보면 될 것 같다. 요약하자면 다음과 같다. 스프링에서는, @Transactional의 propagation 설정을 통해 트랜잭션의 전파를 설정할 수 있다. 1. REQUIRED 기본 설정은 REQUIRED이다. 트랜잭션A(부모) 내부에 트랜잭션B(자식)가 실행되는 경우, 트랜잭션A에 트랜잭션 B가 합류한다. 다시말해 커밋이나 롤백의 기준이 트랜잭션 A만 존재하는 경우와 같다. 아래는 자식 트랜잭션에 주는 속성을 소제목과 같이 바꿨을 때의 동작 방식을 설명한다. 2. REQUIRES_NEW A, B 개별 트랜잭션으로 취급한다. 각각 커밋과 롤백이 이루어진다. 3. MANDATORY 부모에 자식이 합류한다. 다만, 부모 트랜잭션이 없으면 에러가 발생한다. ..