본문 바로가기

[네이버 API 마켓플레이스 appetizer 서포터즈]

[네이버 클라우드 (API 마켓플레이스) APPETIZER 서포터즈] 개발 기록 4차

오늘도 힘내서 블로그 쓰는 시간~! 

시험기간이 이제야 끝나서 개발을 많이 진행하진 못한 상태입니다ㅠㅜ...

그리고 저희 팀에서 한명이 탈주하셨기 때문에.... 아주 난감한 상황입니다 (웃는게 웃는게 아니야..)

팀워크라는 게 참 어렵네요.. 많은 생각을 하게 되었습니다. 

여태 많은 프로젝트를 진행하면서 팀 내에서 탈주하시는 분들이 많았어요.

그리고 저는 이번 탈주로 이 문제가 왜 항상 반복되는지 고민하며, 무엇이 문제인지 생각해보는 시간을 가졌습니다. 

점점 팀워크에 대해 고민을 많이 하고 개선해 나가는 중인데 다음번엔 정말 후회 없이 좋은 팀워크를 꾸려나가게 되었으면 좋겠습니다 : ) 

그래서 두 명이 하게 된 우리 프로젝트 오늘의 빵!!!! 잘 되어가도록 해보겠습니닷!!!!

가즈앙~!

 

 

오늘은 지난번 블로그에서 말한 대로 현재 사용하고 있는 기술인 FirecampQueryDSL을 설명해볼게요!

 

먼저 Firecamp를 말해보자면, 

저희는 spring boot에서 graphQL을 사용하고 있어서,

Rest에서 보통 흔히 사용하는 Postman을 사용하지 못했습니다..! 이래서 파일 업로드가 쉽지 않더라고요..! 하하 

firecamp는 spring boot에서 graphQL을 사용하기 위해!!! 새로 찾아본 도구입니다! 어떤 종류의 API든 지원을 해준다고 하네요! 

파일 업로드 방법을 조금 헤맸는데 인터넷 찾아보면 이미지가 바로 나와 있어서 금방 하실 수 있을 것 같습니다.

아래와 같이 파일을 넣어주면 200 OK 를 받을 수 있습니다. 물론 storage에도 사진이 잘 올라갔고요!

저희는 파일 업로드를 여러 군데에서 사용해서 사용하기 때문에 필수였는데, 다행히 구현을 잘했습니다 후하후하

 

 

 

다음은 QueryDsl입니다!

QueryDSL은 쿼리를 자바 코드로 작성할 수 있게 도와주는 기술입니다.

spring boot에서 JPA와 Data JPA를 사용하시는 분들이 많으실 텐데,

QueryDSL을 사용해서 Spring Data JPA로 해결하지 못하는 복잡한 쿼리나 동적 쿼리를 해결할 수 있습니다!

 

특징

- 문자가 아닌 코드로 쿼리를 작성함으로써, 컴파일 시점에 문법 오류를 쉽게 확인할 수 있다. 

- 자동완성 등 IDE의 도움을 받을 수 있다. 

- 동적인 쿼리 작성이 편리하다. (where 절에 있는 null 값은 자동으로 무시된다.)

 

이점 덕분에 저는 동적 쿼리를 작성할 때는 queryDSL을 항상 사용합니다!! 더 공부하고 싶은 기술이져..흫

 

fetchJoin은 정말 좋은 역할이지만 조심해야 할 사항이 몇가지 있는데요, 

1. 둘 이상의 컬렉션 관계는 fetchJoin을 쓰면 안 될 것 !

     => 데이터가 곱빼기가 되기 때문이다. (ex - team에 orders랑 members 있을 때 = join fetch 가 두번 들어가는 쿼리!!)

2. fetchJoin의 대상은 on, where 등에서 필터링 조건으로 사용하면 안 된다.

     => JPA의 엔티티 데이터는 DB의 데이터와 일관성을 유지해야 한다. 내가 임의로 데이터를 빼고 조회해버리면 DB에 해당 데이터가 없다고 판단하는 것과 똑같다. (최악의 경우 없는 데이터라고 생각해서 삭제될 수도) 별칭을 지원하긴 한다.

    -> 그래서 바로 엔티티가 아닌 그냥 값으로 조회해야 한다. (DTO 조회 방법 사용하기)

    -> 필터링을 하고 싶다면 다 쪽에서 조회를 해서 필터링 조작해주기

3. 컬렉션을 fetchJoin하면 페이징을 할 수 없다! 

   => OneToOne, ManyToOne은 페치조인해도 페이징이 가능하지만

   => OneToMany는 데이터 뻥튀기가 되기때문에 fetch join하려면 distinct 써야 함 -> 여기에 페이징하면 하이버네이트가 메모리에서 실행시켜주는 것임, 쿼리에는 페이징 조건이 안 들어가짐

      -> (다 쪽을 조회해도 괜찮다면) from 절에 있는 entity만 페이징을 하기 때문에 일:다 관계라면 다에 해당하는 것을 from절에 넣어주기

      -> team 속 members의 필드에 @BatchSize()사용하기 (team을 조회하고 따로 members in team id( team1_id, team2_id)쿼리나감 ) 

 

 

대략 사용법은 이렇습니다! 동적으로 쿼리를 작성할 수 있죠,,!

selectFrom에서 entity를 직접 조회하지 않고 DTO를 사용해야 합니다.

 

 

 

여기까지 제가 이번 프로젝트에서 사용한 기술들 소개를 마치고 저희 진행 상황을 살짝 말해보자면, 

기본적인 인증, 파일, 회원 관리 등은 다 되어있고 가게 관리까지 마쳤습니다.

앞으로 남은 기능 남은 18일 정도? 동안 열심히 해보겠습니다! 

모두 모두 화이팅~!!!!

아히자