전체 글 (43) 썸네일형 리스트형 [JPA] Collection 필드를 join 할 때 중복 데이터가 발생하는 이슈 이 포스팅은 아래 포스팅의 후속편입니다. https://dogfootcrabfoot.tistory.com/43 팀 프로젝트에서 발견한 N+1 케이스...인 줄만 알았던 건에 대하여 국비 시절 팀프로젝트 코드를 살펴보다가 아무 생각없이 한 api에 요청을 보냈고.. 요청 하나 보냈을 뿐인데 7개씩 쿼리문이 날아가는 것을 발견하고 적잖이 충격을 받았다. 문제의 서비스는 한 dogfootcrabfoot.tistory.com 💣 문제 상황 에피소드 엔티티(NovelEpisode)와 댓글 엔티티(Comment)는 일대다 양방향 매핑 관계이다. 특정 소설의 모든 에피소드에 달린 댓글 리스트를 조회하기 위해 아래와 같은 쿼리 메소드를 작성했다. @Query("select e from NovelEpisode e joi.. 팀 프로젝트에서 발견한 N+1 케이스...인 줄만 알았던 건에 대하여 국비 시절 팀프로젝트 코드를 살펴보다가 아무 생각없이 한 api에 요청을 보냈고.. 요청 하나 보냈을 뿐인데 7개씩 쿼리문이 날아가는 것을 발견하고 적잖이 충격을 받았다. 문제의 서비스는 한 소설 작품에 달린 모든 댓글 리스트를 반환하는 서비스. 왜 이렇게 쿼리문을 발사하고 있는건지 궁금해져서 코드와 쿼리로그 분석을 해보기로 결정! 본격적으로 분석을 하기 전에, 연관관계 매핑을 배울 때 지연 로딩을 사용하면 엔티티 조회 시 쿼리문이 여러개 날아갈 수 있다고 배웠던 게 어렴풋이 기억이 나서 혹시 지연로딩 전략이 원인이지 않나 싶은 추측을 했다. Comment: Member, NovelEpisode와 다대일 양방향 매핑. 지연로딩. NovelEpisode: NovelInformation과 다대일 양방향 매핑.. [Dart] static 변수 사용해보기 사이드 프로젝트를 진행하던 중 한 클래스에서 static 변수를 두 가지 방법으로 사용하고 있다는 걸 발견하게 됐다. UserDataProvider class에서 stroage라는 static 변수가 있고 signOut() 메서드에선 UserDataProvider.storage 방식으로 불러서 사용하고 있고 writeSignInResDataToStroage() 메서드에선 storage만 불러서 사용하고 있다. UserDataProvider.storage와 storage가 같은 값을 가리키는 것이 맞나? 하는 의문이 생겼다. 당연히 그럴 것 같긴 하지만 궁금하니까 간단한 예제를 만들어서 확인을 해보기로 했다. class User { static String name = "광수"; static void ch.. [SpringBoot] @PathVariable과 @RequestParam 나는 어떤 정보가 포함된 GET요청을 처리해야 할 때 @PathVariable을 사용했었다. 예를 들어 클라이언트가 특정 카테고리의 게시물 리스트 요청을 GET방식으로 보낸다고 가정해보자. 클라이언트는 카테고리에 대한 정보를 보내야 할 것이고 아래와 같은 형태로 @PathVariable을 사용해 처리할 수 있다. 파라미터를 바인딩해주면 이런 식으로 여러 개도 사용할 수 있다. 사실 @PathVariable 파라미터 하나만 바인딩하는 방식만 사용해서 여러 개의 파라미터도 바인딩할 수 있다는 걸 몰랐고, @PathVaraible이 아닌 다른 방식으로 GET 요청에 포함되는 데이터를 어떻게 처리할 수 있을지 검색하다가 @RequestParam을 알게 되었다. 공식문서에서 @RequestParam은 메서드 매개.. [Dart] futures, async, await을 활용한 비동기 코드 작성하기 플러터로 프로젝트를 하면서 api 요청을 보내거나 디스크에서 데이터를 읽고 쓸 때 Future, async, await을 활용한 비동기 함수를 여러 차례 활용했었다. 써보긴 했지만 'Future와 async, await을 왜 사용할까요?'라는 질문에는 명확하게 대답할 수 없었다. 그래서 이번에 확실히 정리를 해보고 넘어가보려고 한다. ❔ 비동기 프로그래밍(Asynchronous Programming)을 사용하는 이유 dart는 프로그램 하나당 스레드 하나를 쓴다. 스레드를 파이프라고 생각하면 작업 하나는 파이프 한쪽으로 들어가서(시작) 다른 쪽으로 나온다(완료). 작업이 파이프에 들어가서 나오는데 걸리는 시간, 즉 완료되는 시간은 작업마다 다르다. 작업 하나가 너무 오래 걸리면 빨리 되는 작업들도 다 같.. [Java] 얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy) 사이드 프로젝트를 작업을 하다가 객체의 불변성을 유지하는 방법이 궁금해져서 chat gpt에게 물어봤다가 얕은 복사, 깊은 복사라는 개념을 접하게 됐다. chat gpt가 소개해준 여러 방법 중 깊은 복사를 하는 방법이 있었는데 어디선가 들어는 봤지만 어떤 개념인지 잘 몰랐다. 그래서 얕은 복사, 깊은 복사가 대체 뭘까? chat gpt에게 얕은 복사와 깊은 복사가 무엇인지 물어봤을 때 답변은 이렇게 정리할 수 있었다. 얕은 복사(Shallow Copy) 객체를 복사할 때, 복사된 객체와 원본 객체가 같은 내부 객체를 참조한다. 즉, 내부 객체의 참조(주소값)만 복사되는 것이다. 따라서, 얕은 복사를 수행한 후에는 원본 객체나 복사된 객체 중 하나에서 내부 객체를 수정하면 다른 객체도 같이 변경될 수 있.. [Flutter] 값 입력 시 TextFormField 간 포커스 이동 이슈(FocusNode의 requestFocus()) 이 이슈는 국비학원에서 flutter + SpringBoot 기반 개인 프로젝트 진행 중에 발생했던 이슈였다. 플러터를 단기 속성강의로 정말 기본만 배우고 들어가서 TextEditingController의 존재도 몰라서 text field 사용자 입력값을 다른 위젯에서 쓰려면 어떻게 받아야하는지 도무지 알 수 없었던..그런 시절이었다. 다트 문법? 그저 플러터를 쓰면서 익혀가는 거였다. (내 기억보다 다트와 플러터에 대해 훨씬 더 많은 가르침을 받았을 수 있지만 원래 쪼렙 시절에 10 떠먹여주면 1, 2도 겨우 받아먹기 때문에 어디 기록으로 남은 거 아니면 안배운 거랑 또이또이 수준) 각설하고 이게 어떤 문제였냐면 영상으로 보자. 각 text form field는 유효성 검사를 진행한다. 한 text f.. [리뷰] 객체지향의 사실과 오해 | 조영호 https://www.yes24.com/Product/Goods/18249021 객체지향의 사실과 오해 - YES24 『객체지향의 사실과 오해』는 객체지향이란 무엇인가라는 원론적면서도 다소 위험한 질문에 답하기 위해 쓰여진 책이다. 안타깝게도 많은 사람들이 객체지향의 본질을 오해하고 있다. 가장 www.yes24.com 이 책을 알게된 건 클린 코드와 마찬가지로 개발을 막 배워보려고 했을 때였다. 현실적인 이유로 자바를 배우기로 정하고 나서, 일명 객체지향 언어라는 자바를 잘 써먹으려면 객체 지향이 뭔지 꼭 알고 있어야 할 것 같았다. 인터넷에 검색으로 접할 수 있는 객체지향에 대한 정의와 서술은 만족스러운 답변이 아니었다. 객체지향 프로그래밍을 왜 해야하며 어떤 방식이 객체지향 프로그래밍인지 더 쉽게,.. 이전 1 2 3 4 ··· 6 다음