전체 글
-
첫 사진부터 놀래켜드려서 죄송하구요 JPA에서 ID를 할당하는 방법이 여러가지가 있죠, 뭐 수동 할당, 자동 할당, IDENTITY, SEQUENCE, TABLE, AUTO 등이 있는데요 이거 잘 보지 않으면 진짜 헷갈립니다같이 한번 정리해보죠 스따뜨수동 할당수동 할당은 직접 ID를 채워 넣어주는 방식인데요, 한번 해보겠습니다@Entity@Getter@NoArgsConstructor@AllArgsConstructorpublic class Study { @Id private String id; private String name;} 이 엔티티를@Transactional@SpringBootTestpublic class StudyTest { @Autowired StudyReposit..
잘 보지 않으면 헷갈리는 ID 에 대한 고찰첫 사진부터 놀래켜드려서 죄송하구요 JPA에서 ID를 할당하는 방법이 여러가지가 있죠, 뭐 수동 할당, 자동 할당, IDENTITY, SEQUENCE, TABLE, AUTO 등이 있는데요 이거 잘 보지 않으면 진짜 헷갈립니다같이 한번 정리해보죠 스따뜨수동 할당수동 할당은 직접 ID를 채워 넣어주는 방식인데요, 한번 해보겠습니다@Entity@Getter@NoArgsConstructor@AllArgsConstructorpublic class Study { @Id private String id; private String name;} 이 엔티티를@Transactional@SpringBootTestpublic class StudyTest { @Autowired StudyReposit..
2025.08.15 -
안녕하세요 마구잡이로 다 처먹고 있는 요즘입니다 요즘 성능 개선에 꽂혀서 눈에 불을 켜고 그런 거만 찾고 있는데요 쿼리 튜닝만 주구장창하다가 이게 과연 효과가 있나 싶더라고요 그래서 반정규화를 적용해 봤습니다 스따뜨 저희 챗봇 서비스에는 마이페이지에 유저가 한 질문수를 보여줘야 하는 요구사항이 있습니다 원래는 쿼리를 최적화해서 마이페이지 요청이 들어올 때마다 질문수를 계산하곤 했는데요 이게 질문수가 많아지면 노답이 될것 같은 생각이 들었습니다GET http://localhost:8080/api/v1/members/meHTTP/1.1 200 Content-Type: application/jsonTransfer-Encoding: chunkedDate: Sat, 05 Jul 2025 04:29:49 GMT{ ..
계속 쿼리튜닝만 하다가 그냥 반정규화 적용해버리기안녕하세요 마구잡이로 다 처먹고 있는 요즘입니다 요즘 성능 개선에 꽂혀서 눈에 불을 켜고 그런 거만 찾고 있는데요 쿼리 튜닝만 주구장창하다가 이게 과연 효과가 있나 싶더라고요 그래서 반정규화를 적용해 봤습니다 스따뜨 저희 챗봇 서비스에는 마이페이지에 유저가 한 질문수를 보여줘야 하는 요구사항이 있습니다 원래는 쿼리를 최적화해서 마이페이지 요청이 들어올 때마다 질문수를 계산하곤 했는데요 이게 질문수가 많아지면 노답이 될것 같은 생각이 들었습니다GET http://localhost:8080/api/v1/members/meHTTP/1.1 200 Content-Type: application/jsonTransfer-Encoding: chunkedDate: Sat, 05 Jul 2025 04:29:49 GMT{ ..
2025.08.13 -
환장 듀오 N+1 문제와 동기 처리 콜라보 해결기 시작합니다스따뜨 저희 챗봇 서비스에는 마이페이지에 유저가 한 질문수를 보여줘야 하는 요구사항이 있습니다 근데 그때그때 쿼리를 날려주기보다는 그냥 반정규화로 질문 수를 보여주는 칼럼을 디비에 만들고 매일 배치 처리로 해당 칼럼을 갱신해 주기로 했습니다 근데 지난 시간에 반년 만에 다시 이해한 N+1 문제N+1 문제 해결 후기두 엔티티 간에 영속성 전이가 제대로 이루어지려면?현재 진행하고 있는 개인 프로젝트에서 다음과 같이 엔티티들의 연관관계가 설정되어 있다. Member -- (OneToMany) -- History -- (Ondockerel.tistory.com N+1 문제들을 발견 한 이후로 성능상 심각하다는 걸 깨닫고 성능 측정을 해봤습니다 결과는 ..
N+1 문제와 동기 처리의 환장 콜라보환장 듀오 N+1 문제와 동기 처리 콜라보 해결기 시작합니다스따뜨 저희 챗봇 서비스에는 마이페이지에 유저가 한 질문수를 보여줘야 하는 요구사항이 있습니다 근데 그때그때 쿼리를 날려주기보다는 그냥 반정규화로 질문 수를 보여주는 칼럼을 디비에 만들고 매일 배치 처리로 해당 칼럼을 갱신해 주기로 했습니다 근데 지난 시간에 반년 만에 다시 이해한 N+1 문제N+1 문제 해결 후기두 엔티티 간에 영속성 전이가 제대로 이루어지려면?현재 진행하고 있는 개인 프로젝트에서 다음과 같이 엔티티들의 연관관계가 설정되어 있다. Member -- (OneToMany) -- History -- (Ondockerel.tistory.com N+1 문제들을 발견 한 이후로 성능상 심각하다는 걸 깨닫고 성능 측정을 해봤습니다 결과는 ..
2025.08.09 -
N+1 문제 해결 후기두 엔티티 간에 영속성 전이가 제대로 이루어지려면?현재 진행하고 있는 개인 프로젝트에서 다음과 같이 엔티티들의 연관관계가 설정되어 있다. Member -- (OneToMany) -- History -- (OneToMany) -- Question dockerel.tistory.com 정확하게 반년 전에 N+1 문제를 맞닥뜨렸습니다이때 당황한 기억이 아니 그 당황했다기보다는 그 유명한 N+1 문제를 직접 겪었단 사실에 가슴이 두근두근 했던 기억이 나네요 반년이 지난 지금 저는 N+1 문제에 대해 얼마나 더 자세히 알게 됐을지 알아보겠습니다스따뜨 우선 N+1 문제의 정의는 그거죠JPA에서 연관 관계가 설정된 엔티티를 조회할 경우, 조회된 데이터 개수 N만큼 연관관계의 조회 쿼리가 추가로 ..
반년 만에 다시 이해한 N+1 문제N+1 문제 해결 후기두 엔티티 간에 영속성 전이가 제대로 이루어지려면?현재 진행하고 있는 개인 프로젝트에서 다음과 같이 엔티티들의 연관관계가 설정되어 있다. Member -- (OneToMany) -- History -- (OneToMany) -- Question dockerel.tistory.com 정확하게 반년 전에 N+1 문제를 맞닥뜨렸습니다이때 당황한 기억이 아니 그 당황했다기보다는 그 유명한 N+1 문제를 직접 겪었단 사실에 가슴이 두근두근 했던 기억이 나네요 반년이 지난 지금 저는 N+1 문제에 대해 얼마나 더 자세히 알게 됐을지 알아보겠습니다스따뜨 우선 N+1 문제의 정의는 그거죠JPA에서 연관 관계가 설정된 엔티티를 조회할 경우, 조회된 데이터 개수 N만큼 연관관계의 조회 쿼리가 추가로 ..
2025.08.06 -
안녕하세요 문제는 그렇게 시작된 건 아니고 그냥 엔티티의 상태에 한번 정리해보려고 합니다 렛츠고 일단 영속성 컨텍스트는 엔티티를 영구 저장하는 환경으로 1차 캐싱, 쓰기 지연, 변경 감지를 통해 영속 로직을 효율적으로 할 수 있게 해줍니다 그리고 엔티티 매니저는 이 영속성 컨텍스트를 관리하는 작업을 도와주는 역할로, 영속성 컨텍스트와 상호작용함으로서 영속 로직을 수행하는 역할을 가지고 있습니다 엔티티 매니저에 의해 관리되는 엔티티는 영속성 컨테이너에 대해 세 가지 상태를 갖습니다 비영속엔티티 객체가 새로 생성되었지만 아직 영속성 컨텍스트와 연관되지 않은 상태입니다 public void create(String id, String name) { Study study = new Study(id, nam..
엔티티가 비영속이었다가 영속됐다가 준영속됐다가 다시 영속됐다가 ...더보기안녕하세요 문제는 그렇게 시작된 건 아니고 그냥 엔티티의 상태에 한번 정리해보려고 합니다 렛츠고 일단 영속성 컨텍스트는 엔티티를 영구 저장하는 환경으로 1차 캐싱, 쓰기 지연, 변경 감지를 통해 영속 로직을 효율적으로 할 수 있게 해줍니다 그리고 엔티티 매니저는 이 영속성 컨텍스트를 관리하는 작업을 도와주는 역할로, 영속성 컨텍스트와 상호작용함으로서 영속 로직을 수행하는 역할을 가지고 있습니다 엔티티 매니저에 의해 관리되는 엔티티는 영속성 컨테이너에 대해 세 가지 상태를 갖습니다 비영속엔티티 객체가 새로 생성되었지만 아직 영속성 컨텍스트와 연관되지 않은 상태입니다 public void create(String id, String name) { Study study = new Study(id, nam..
2025.08.05 -
안녕하세요 사실 귀찮은 건 아니구요 머리 한 움큼 쥐어뜯으면서 개발했습니다 렛츠고 문제는 그렇게 시작됐습니다 ??? : 경제 리포트 서비스에 리포트만 있으면 뭐 앱에 들어오나요 바로 설득돼서 무슨 기능 넣을까 하다가 생각한 게요약된 뉴스 푸시 알림 기능입니다 그래도 사실 막 어렵진 않았습니다. 이미 뉴스 크롤링과 요약 모듈이 존재했거덩요 문제는 FCM 가장 중요한건 기기마다 할당되는 FCM 토큰을 어떻게 관리할지였는데, 사실 뭐가 어렵냐고 생각할 수도 있습니다 그냥 유저 테이블에 필드 하나 추가하면 되는거 아니냐고요? 네 맞습니다. 근데 우리 서비스는 유저 테이블이 없어요 간단한 서비스 만들려고 유저 관리도 안하고 인증도 안하고 그래서 생각한 방법이 이겁니다 앱 최초 접속시 UUID로 ID를 부여하고..
FCM 푸시 알림 개발기...찮다안녕하세요 사실 귀찮은 건 아니구요 머리 한 움큼 쥐어뜯으면서 개발했습니다 렛츠고 문제는 그렇게 시작됐습니다 ??? : 경제 리포트 서비스에 리포트만 있으면 뭐 앱에 들어오나요 바로 설득돼서 무슨 기능 넣을까 하다가 생각한 게요약된 뉴스 푸시 알림 기능입니다 그래도 사실 막 어렵진 않았습니다. 이미 뉴스 크롤링과 요약 모듈이 존재했거덩요 문제는 FCM 가장 중요한건 기기마다 할당되는 FCM 토큰을 어떻게 관리할지였는데, 사실 뭐가 어렵냐고 생각할 수도 있습니다 그냥 유저 테이블에 필드 하나 추가하면 되는거 아니냐고요? 네 맞습니다. 근데 우리 서비스는 유저 테이블이 없어요 간단한 서비스 만들려고 유저 관리도 안하고 인증도 안하고 그래서 생각한 방법이 이겁니다 앱 최초 접속시 UUID로 ID를 부여하고..
2025.08.04 -
안녕하세요 저희 서비스 "BigPicture"는 매일 자동으로 여러 경제 지표와 뉴스를 크롤링하여 매주 경제 리포트를 생성해주는 서비스인데요 이거 리포트 어케 생성하는걸까요? 그러게요 사실 첨엔 LLM에 데이터 싹다 털어넣고 만들어줘! 하면 주는줄 알았는데 이딴 결과물이 나옴 눈앞에 산학프로젝트 성적 C+가 아른아른 거리는데요 마침 인프런 만우절 때 사놓은 1000원짜리 RAG 강의가 있어서 그걸 들어봤습니다 AI 에이전트로 구현하는 RAG 시스템(w. LangGraph)| 판다스 스튜디오 - 인프런 강의현재 평점 4.9점 수강생 7569명인 강의를 만나보세요. 랭그래프(LangGraph)로 구현하는 검색증강생성(RAG) 지능형 AI 에이전트! 이론부터 실전까지, 초보자도 쉽게 따라할 수 있는 핸즈..
앉으나 서나 리포트 파이프라인 고민, 근데 지금은 누워있음안녕하세요 저희 서비스 "BigPicture"는 매일 자동으로 여러 경제 지표와 뉴스를 크롤링하여 매주 경제 리포트를 생성해주는 서비스인데요 이거 리포트 어케 생성하는걸까요? 그러게요 사실 첨엔 LLM에 데이터 싹다 털어넣고 만들어줘! 하면 주는줄 알았는데 이딴 결과물이 나옴 눈앞에 산학프로젝트 성적 C+가 아른아른 거리는데요 마침 인프런 만우절 때 사놓은 1000원짜리 RAG 강의가 있어서 그걸 들어봤습니다 AI 에이전트로 구현하는 RAG 시스템(w. LangGraph)| 판다스 스튜디오 - 인프런 강의현재 평점 4.9점 수강생 7569명인 강의를 만나보세요. 랭그래프(LangGraph)로 구현하는 검색증강생성(RAG) 지능형 AI 에이전트! 이론부터 실전까지, 초보자도 쉽게 따라할 수 있는 핸즈..
2025.08.02 -
안녕하세요. 리얼 허거덩거덩스한 상황인데요 문제는 그렇게 시작됐습니다. 저희 서비스 "BigPicture"는 매일 자동으로 여러 경제 지표와 뉴스를 크롤링하여 매주 경제 리포트를 생성해주는 서비스인데요 크롤링 시 모종의 이유로 실패해서 데이터를 수집하지 못한다면 큰일나겠죠~? 사실 또 저희가 크롤링 후 변환 로직에 LLM과 베타버전인 자바용 랭체인을 사용해서 예상치 못한 오류가 엄청 많았습니다. 그래서 생각해낸게... 크롤링 로직을 재시도 로직으로 감싸서 실행하자! 크 시작합니다 우선 파라미터로 메인 로직을 () -> ~~~ 로 넘겨줘야 할 것 같은데, 뭘 써야할까요? 찾아보니 Supplier라는 인터페이스가 있었습니다. 이런걸 함수형 인터페이스라 부르는데 대표적으로 Predicate입력값을 하나 받아..
직접 재시도 로직 구현했는데 알고 보니 이미 있는 리얼 허거덩거덩스한 상황안녕하세요. 리얼 허거덩거덩스한 상황인데요 문제는 그렇게 시작됐습니다. 저희 서비스 "BigPicture"는 매일 자동으로 여러 경제 지표와 뉴스를 크롤링하여 매주 경제 리포트를 생성해주는 서비스인데요 크롤링 시 모종의 이유로 실패해서 데이터를 수집하지 못한다면 큰일나겠죠~? 사실 또 저희가 크롤링 후 변환 로직에 LLM과 베타버전인 자바용 랭체인을 사용해서 예상치 못한 오류가 엄청 많았습니다. 그래서 생각해낸게... 크롤링 로직을 재시도 로직으로 감싸서 실행하자! 크 시작합니다 우선 파라미터로 메인 로직을 () -> ~~~ 로 넘겨줘야 할 것 같은데, 뭘 써야할까요? 찾아보니 Supplier라는 인터페이스가 있었습니다. 이런걸 함수형 인터페이스라 부르는데 대표적으로 Predicate입력값을 하나 받아..
2025.08.01