본문 바로가기

반응형

분류 전체보기

(133)
[JPA] N+1문제 N+1 문제란 ? 요청이 1개의 쿼리로 처리 되길 기대했지만, N개의 추가 쿼리(하위 엔티티들 조회 쿼리)가 발생하는 현상 예시 JPA에서 "팀(1개) - 팀원(5명)" 과 같은 1대 N의 연관관계가 Lazy Fectch로 존재할 경우, 팀의 팀원을 조회하면 총 6번의 쿼리가 실행된다. 먼저, 처음 팀을 조회하는 쿼리가 발생하고, 해당 팀의 팀원들에 대한 쿼리가 5개 실행되어 총 6번의 쿼리분이 발생하기 때문이다. 원인 JPA에서 FetchType을 Lazy Fetch Loading으로 설정할 경우, 처음 팀을 조회 시 팀원 데이터를 함께 가져오지 않고, 팀원에 대한 Proxy 객체만 가져온다. 이후, 조회한 팀에서 팀원을 조회할 때, JPA의 1차 캐시에서 팀원에 대한 데이터가 있는지 확인 후 쿼리를 ..
[백엔드 기록] SSE와 소켓 Help Todo 서비스는 팀 단위 투두리스트 서비스이다. 같은 팀에서 투두리스트를 수정할 경우, 다른 팀원들의 투두리스트를 수정된 데이터로 업데이트해주어야 한다. 나는 이 부분을 웹 소켓의 Pub/Sub 방식으로 해결하려고 했다. 구독, 발행 방식을 구현하는 중, SSE라는 걸 알게 되었고, 해당 데이터 노티 기능은 SSE로 구현하는 것이 적합한거 같아 SSE에 대해 찾아보았다. SSE란 ? Server-Sent-Event의 약어로, 클라이언트가 HTTP를 통해 서버에서 자동 업데이트를 받을 수 있도록 하는 서버 푸시 기술이다. SSE ↔️ 소켓 방향성 SSE는 서버에서 클라이언트로 데이터를 전송해주는 단방향 푸시 기술이다. 소켓은 서버와 클라이언트가 서로 데이터를 주고 받을 수 있는 양방향 기술이다...
[문제 기록] NEXT.JS(SSR) Error: Text content does not match server-rendered HTML. 문제 상황 프로젝트 진행 중, 팀원이 들어간 팀 페이지에서 새로고침을 할 경우, 페이지의 데이터들이 사라졌다. 해당 데이터들을 유지하고자, Zustand의 Persist를 이용해 Storage에 저장을 해주고 테스를 해보니 아래와 같은 에러가 발생하였다. 원인 분석 해당 에러코드는 SSR에서 나타나는 문제로, 서버 측의 렌더링된 결과와 브라우저에서 렌더링된 결과가 달라서, 생기는 문제이다. todoTableData는 zustand의 Persist로 생성한 저장소인데, 코드 상에서는 아래와 같은 부분에서 "?"이 문제를 발생시킨다. 해결 Zustand Persist된 데이터들은 HTML에서 ? 연사자(삼항 연산자) 혹은 && 연산자를 이용하지말고, 아래와 같이 데이터를 먼저 체크 후, 리턴해 준다. 만약,..
[DB] OUTER JOIN 정리 OUTER JOIN OUTER 레코드들도 포함 시키는 조인 OUTER 란? A_TABLE ID NAME A 갑 B 을 C 병 D 정 B_TABLE INDEX ID TITLE 1 A "김치찌게 끓이는 법" 2 A "된장지께 만들기" 3 A "김치 담그기" 4 F "스파게티 만들기" 5 G "요리 팁" 위의 두 테이블이 있을 때, 참조키가 일치하지 않는 레코드들을 OUTER 레코드라고 한다. (색칠된 부분들) OUTER 조인 종류 SELECT * FROM A_TABLE LEFT/RIGHT/FULL OUTER JOIN B_TABLE ON A_TABLE.ID = B_TABLE.ID 위처럼 있을 경우, LEFT OUTER JOIN "LEFT OUTER JOIN" 기준으로 왼쪽에 있는 A_TABLE의 OUTER들을..
[DB] INNER JOIN 정리 INNER JOIN 두 테이블 중 관계가 있는 레코드만 합쳐진다. (관계가 없는 레코드는 제외) 아이디 이름 테이블 (A_TABLE) ID 이름 1 갑 2 을 3 병 4 정 개인정보 테이블 (B_TABLE) ID A_TABLE_ID 출생지 나이 A 1 서울 32 B 1 부산 32 C 3 대구 34 D 5 여수 25 E 6 광주 62 INNER JOIN 결과 SELECT * FROM A_TABLE (INNER)JOIN B_TABLE ON A_TABLE.ID = B_TABLE.A_TABLE_ID INNER 부분을 생략 가능! ID 이름 ID A_TABLE_ID 출생지 나이 1 갑 A 1 서울 32 1 갑 A 1 서울 32 3 병 C 3 대구 34 참고 영상 https://www.youtube.com/watc..
react JWT 토큰 저장, 가져오기 쿠키 훅 등록 위와 같이 useCookies를 가져와서 훅으로 등록 해준다. react-cookie 설치 : npm i react-cookie const [cookie, setCookie, removeCookie] = useCookies(['id']) cookie : 쿠키 변수 setCookie : 쿠키 변수 등록 removeCookie : 쿠키 삭제 'id' : id라는 이름으로 쿠키 변수 생성 쿠기 저장 및 조회 이후, 백엔드에 jwt 토큰 요청 후, 받은 토큰을 setCookie(저장할 이름, 값)으로 저장하며, 저장된 쿠키 값을 꺼낼 때는 const [cookie] = setCookie(["id"]) // ... console.log(cookie.id) 이런식으로 사용해주면 된다. Axios로 J..
[문제 기록] 클라이언트에 응답 시, JPA 양방향 객체 무한 참조 문제 상황 Team 목록을 클라이언트에 넘겨 줄때, 아래와 같이 무한 참조 현상이 나타났다. 문제 원인 코드 @RequestMapping(value = "/team/findTeamList") public ResponseEntity findTeamList(){ List allTeams = teamService.findAllTeams(); if (!allTeams.isEmpty()) { return ResponseEntity.ok().body(allTeams); } return null; } Team은 소속 멤버에 대한 테이블인 JoinTeams를 가지고 있다. 또한, JoinTeams는 Member와 양방향 관계를 가지고 있다. 이때, Team 객체의 정보를 불러올 때, JoinTeams를 가져오고, Jo..
[에러] Builder 패턴 중 NullPointExepction 프로젝트의 객체들에 Builder를 추가하고 테스트하는 중 에러가 발생하였다. 에러의 문구는 아래와 같았다... java.lang.NullPointerException: Cannot invoke "java.util.List.add(Object)" because the return value of "HelpTodo.helptodoBackend.domain.Team.getJoinTeams()" is null 에러 발생 코드 //Team 클래스 @Entity @Builder @Table(name = "team") @AllArgsConstructor @NoArgsConstructor @Getter public class Team { @Id @Column(name = "team_name") private Stri..