본문 바로가기
반응형

Spring91

일반 Join vs Fetch Join * 개요 Fetch Join를 공부하고 정말 좋은 기능이며 성능에 뛰어나다는 사실을 알았습니다. 그렇게 공부하던 중, 일반 Join과 Fetch Join은 구체적으로 어떤 차이가 있는지 궁금해졌습니다. 따라서 예제를 기반으로 내용을 정리합니다. * 조건 Author : Book이 1 : N로 연관관계를 가지고 있다고 가정합니다. 연관관계의 주인은 Author입니다. 특히, join은 FROM절에 N인 Book이 오느냐, 1인 Author가 오느냐에 따라서 성능이 차이가 납니다. 각 상황을 비교해봅니다. * Author @Entity public class Author implements Serializable { private static final long serialVersionUID = 1L; @I.. 2022. 6. 29.
스프링 데이터와 Querydsl 실무에서 사용하기 실무에서 사용하기 위해 다음과 같은 설계를 합니다 MemberRepository interface는 JpaRepository 이외에도 MemberRepositoryCustm interface를 상속합니다. MemberRepositoryCustom interface는 search()라는 메서드가 있는데 이는 MemberRepositoryImpl에서 상속하여 구현합니다. 여기서 Querydsl이 사용됩니다. 개발자가 개발한 쿼리문이 사용되는 곳에는 Custom을 붙입니다. 또한 직접 구현하는 클래스 뒤에 Impl이 붙습니다. *MemberRepository public interface MemberRepository extends JpaRepository, MemberRepositoryCu.. 2022. 2. 13.
순수 JPA와 Querydsl 순수 JPA 사용하기 순수 JPA를 사용하여 MemberJpaRepository를 구현합니다 @Repository public class MemberJpaRepository { private final EntityManager em; private final JPAQueryFactory queryFactory; public MemberJpaRepository(EntityManager em) { this.em = em; this.queryFactory = new JPAQueryFactory(em); } public void save(Member member) { em.persist(member); } public Optional findById(Long id) { Member findMember = em... 2022. 2. 13.
QueryDsl 수정, 삭제 수정 기본적으로 JPA는 수정, 삭제 시에 1건당 1번의 쿼리문을 날립니다. 연봉 인상같은 전체 적용사항은 한명씩 처리하는 것보다, 한번의 쿼리로 처리하는게 훨씬 효율성이 좋습니다. 이를 벌크 연산이라고 합니다. 수정을 실행해봅니다. 벌크연산은, 모든 member를 영속성 컨텍스트에 올리고 바로 DB에 반영합니다. 그런데, 영속성 컨텍스트에 수정된 값을 반영하지 않기 때문에 영속성 컨텍스트와 DB는 정합성이 맞지 않습니다. //member1 = 10 -> DB member1 //member2 = 20 -> DB member2 //member3 = 30 -> DB member3 //member4 = 40 -> DB member4 long count = queryFactory .update(member) ... 2022. 2. 13.
Querydsl 동적쿼리 동적쿼리 사용 2가지 방법 동적 쿼리 사용을 위해서는 2가지 방법이 있습니다. BooleanBuilder Where 다중 파라미터 사용 BooleanBuilder where절에 BooleanBuilder를 넣는 방식입니다. and 혹은 or을 사용할 수 있습니다. 아래는 username과 age를 동적 쿼리로 조회합니다. where 절의 핵심 코드는 아래와 같습니다. ... .where(builder) ... @Test public void BooleanBuilderQuery() { String usernameParam = "member1"; Integer ageParam = 10; List result = searchMember1(usernameParam, ageParam); Assertions.ass.. 2022. 2. 13.
QueryDsl 프로젝션 문법 프로젝션 프로젝션이란 select 대상 지정을 의미합니다. 대상이 1개인지 복수개인지에 따라 방식이 달라집니다 셀렉션(selection)은 행 단위의 조회입니다 프로젝션(projection)은 열 단위의 조회입니다. 따라서 프로젝션 조회란, 행이 아닌 열을 중심으로 생각해야 합니다. 1. 프로젝션 대상이 하나 단순히 username만 조회하기 때문에 일반 조회처럼 하면 됩니다. List result = queryFactory .select(member.username) .from(member) .fetch(); 2. 튜플 조회 프로젝트 대상이 둘 이상일 때는 튜플 조회를 사용합니다. @Test public void tupleQuery() { List result = queryFactory .select(.. 2022. 2. 13.
QueryDsl 기본문법 QueryDsl 검색 조건 쿼리(From, Where) 검색 조건은 username이 member1, 나이가 10~30살인 사람입니다. select, from은 같은 경우 selectFrom으로 합쳐서 사용할 수 있습니다. where조건은 and로 게속 이어나갈 수 있습니다. @Test public void search() { Member findMember = queryFactory .selectFrom(member) .where(member.username.eq("member1").and(member.age.between(10, 30))) .fetchOne(); Assertions.assertThat(findMember.getUsername()).isEqualTo("member1"); } and 로 .. 2022. 2. 12.
JPA & JPQL & QueryDsl 개요 JPA, JPQL, QueryDsl을 사용하여 조회하는 방법을 비교해봅니다. 조회 방식 코드로 테스트해보기 상황은 Team과 Member가 1:N으로 연관관계를 가지고 있다고 가정합니다. EntityManager를 통해 Team과 Member를 생성합니다. N쪽에 연관관계의 주인이기 때문에 FK를 가집니다. JPA 설정에서 주의 할 것은, @ManyToOne 연관관계에서 fetch를 LAZY로 설정해야 합니다.(default는 EAGER입니다.) JPA 기본 데이터 테스트 순수 JPA로, em.createQuery()를 사용해서 쿼리를 만들 수 있습니다. persist로 영속성 컨텍스트에 넣고, flush로 반영하고, 마지막에는 clear로 영속성 컨텍스트에 담긴 모든 것을 초기화합니다. @Spri.. 2022. 2. 12.
Spring framework 로그(log) 알아보기 [ 개요 ] 이번에 log4j2 보안 이슈가 터지면서 스프링 로그의 버전을 확인해보았다. 이슈가 터진 버전은 log4j2의 2.0버전 이상이었고 다행인지 불행인지 적용된 로그는 log4j 1.2 버전이었다. 이것도 처음에는 slf4j랑 헷갈려서 1.6.6 버전으로 착각했다. 아무래도 의존성에 slf4j-log4j12 를 보고 그냥 버전이 똑같겠구나 생각한 탓이다. 그만큼 스프링 로그에서 아는 것이 없다고 생각이 들어서 종류와 사용법을 공부했다. [ 목표 ] - 로그 개념 - 로그 종류인 log4j, logback, log4j2의 차이점을 비교한다. - 각 로그들의 spring boot와 spring legacy 의존성 설정을 알아본다 [ 본문 ] 로그는 특정 이슈를 분석하기 위해서 사용하는 도구로, 로그.. 2021. 12. 16.
반응형