멋사 Backend 62일차 🦁

신재원·2023년 7월 19일

🔎 데이터 베이스

🤜🤛 Join

Left [Outer] Join

  • 실무에서 가장 많이 사용합니다.
  • 중간 Outer 는 붙여도 되고 안붙여도 됩니다.
  • Null 이 존재할수 있습니다.
  • AB 테이블중 교집합 + A 와 유사합니다.
  • Outer 조인은 한쪽에만 데이터가 있어도 결과가 나옵니다.
  • A 테이블과 오른쪽 B 테이블의 전부가 매칭이 안되더라도
    Null 로 컬럼이 채워진다.

아래 SQL 쿼리문 처럼 작성할수 있습니다. From 절에 ON 키워드를 작성하여 조인 조건을 작성해야 합니다.

SELECT *
FROM A LEFT (OUTER) JOIN B ON A.id = B.id
[WHERE 검색 조건]

Left 조인의 반대인 Right 조인도 존재합니다. 방향만 반대일뿐 내용은 똑같습니다.

[Inner] 조인

  • Null 행이 존재 하지 않습니다.
  • Inner를 작성하지않고 Join만 작성할수 있으며, Inner Join 을 작성한 것과 동일합니다.
  • Inner 조인을 사용할수 없는경우 Left 조인을 사용하면 됩니다.
  • AB 테이블의 교집합과 유사합니다.
  • A 테이블과 오른쪽 B 테이블의 컬럼이 모두 매칭이 되어야 합니다.

아래 SQL 쿼리문 처럼 작성할수 있습니다. From 절에 ON 키워드를 작성하여 조인 조건을 작성해야 합니다.

SELECT *
FROM A (Inner) JOIN B ON A.id = B.id
[WHERE 검색 조건]

Full Outer 조인

  • 결과론적으로 말하자면 실무에서 잘 사용하지 않는다.
  • mysql에서는 Full Outer 조인 대신 Union 키워드를 제공합니다.
  • AB 테이블의 합집합 개념과 유사합니다.
SELECT *
FROM A Full Outer Join B

크로스 조인

  • 상호 조인이라고 하며, 전체 행 개수는 두 테이블의 각 행의 개수를 곱한 수만큼 됩니다.

카티션 곱(CARTESIAN PRODUCT)라고도 합니다.

  • 한쪽 테이블의 모든 행과 다른쪽 테이블의 모든 행을 조인 시키는 것입니다.

아래의 SQL 쿼리문으로 작성할수 있습니다.

SELECT *
FROM A CROSS JOIN B

alias (별칭)

아래의 SQL 쿼리문 처럼 as, AS 키워드를 사용해 별칭을 부여해줄수 있으며,
추후 쿼리문을 작성시 a1.name 등으로 별칭을 통해 작성해야 합니다.

SELECT *
FROM A as a1 CROSS JOIN B as b1

🌈 Qurey Dsl

  • Query Dsl 이란?

JPQL 대신 활용해 볼수 있는 프레임 워크 입니다. 실무에서 복잡한 쿼리나 동적 쿼리를 작성하는데 있어 도입해 볼만한 프레임 워크입니다.
(메소드 추출을 통해 재사용 용이)

기존 JPQL

String findName = "select m from Member m where m.username = :username";

▶ em은 EntityManager의 약자 입니다. 
List<Member> memberNameList = em.createQuery(findName,Member.class).getResultList();

Query Dsl 적용

String username = "shin";

List<Member> result = queryFactory
        .select(member)
        .from(member)
        .where(usernameEq(username))
        .fetch();

Query Dsl 의 장점
1. 빌더 패턴으로 작성할수 있습니다 ➡ 가독성 증가
2. 컴파일 시점에 문법 오류를 확인할수 있습니다.
3. usernameEq와 같은 메소드를 사용할수 있습니다. (Eq는 Equals 입니다.)

➡ Spring 3.xx 버전에서의 Query Dsl 을 사용하려면 의존성 주입을 해줘야 합니다.

//querydsl 추가
    implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
    annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
    annotationProcessor "jakarta.persistence:jakarta.persistence-api"
  • 의존성 추가후 오른쪽 Gradle 탭에서 compile.java를 더블클릭합니다.
  • 프로젝트 파일의 build 패키지에서 쿼리 DSL에서 만들어준 Q~ 클래스를 확인할수 있습니다.

Reference

https://www.youtube.com/watch?v=pJqBR2TNe24

https://www.youtube.com/watch?v=WnB1Kn8VbfU

https://ittrue.tistory.com/292

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

정말 좋은 글 감사합니다!

답글 달기