JPA의 N+1문제는 연관관계가 설정된 엔티티를 조회할 경우, 조회된 데이터 개수(N)만큼 연관관계의 조회 쿼리가 추가로 발생하는 현상입니다.ex) 유저 한명이 쓴 게시글들을 조회할 때, 유저-게시글을 join한 형태의 쿼리문을 원했지만, N개의 게시글을 또 조회하는 쿼리가 날아가는 경우라고 생각하면 될 것 같습니다. N+1 문제를 어떻게 해결할 수 있을까요?N+1문제를 해결하기 위해서는 fetch join 또는 @EntityGraph를 사용해 볼 수 있습니다.fetch join연관관계에 있는 엔티티를 한번에 즉시 로딩하는 구문입니다.쿼리 한번에 모든 데이터를 가져오기 때문에 JPA가 제공하는 Paging API 사용 불가능 (Pageable 사용 불가)1:N 관계가 두 개 이상인 경우 사용 불가fet..
분류 전체보기
엔티티 매니저는 엔티티의 상태를 변경하고, 영속성 컨텍스트와 상호작용함으로써 영속 로직을 수행하는 역할을 가지고 있습니다. +) 영속성 컨텍스트는 엔티티를 영구 저장하는 환경으로 1차 캐싱, 쓰기 지연, 변경 감지를 통해 영속 로직을 효율적으로 할 수 있게 해줍니다. 이런 효율적인 영속 로직 수행을 위해서 엔티티는 영속성 컨텍스트에 관리되어야 합니다. 이러한 작업을 도와주는 것이 엔티티 매니저입니다. → 엔티티 매니저는 엔티티가 영속성 컨텍스트에서 효율적으로 관리되도록 도와주는 것이다. 조금 더 구체적으로 엔티티 매니저의 역할을 설명해주세요.엔티티는 영속성 컨텍스트와 관련하여 비영속, 영속, 준영속, 삭제 4가지 상태를 가질 수 있습니다. 엔티티 매니저는 persist, merge, remove, clo..
먼저ddl-auto 옵션은 스프링 부트 어플리케이션에서 Hibernate와 같은 JPA 구현체를 사용할 때 데이터베이스 스키마 관리를 제어하는 설정입니다. 이 옵선은 application-properties 또는 application.yml 파일에서 설정할 수 있으며, 다양한 값에 따라 데이터베이스 스키마에 대해 다른 동작을 수행합니다. ddl-auto 옵션에는 none, validate, update, create, create-drop 등이 존재합니다. 그래서 각 옵션들은 언제 사용하나요?nonenone으로 설정하면 데이터베이스 스키마와 관련된 어떠한 작업도 수행하지 않습니다. 데이터베이스 스키마를 수동으로 관리하고 싶을 때 유용하며, 프로덕션 환경에서 주로 사용합니다.validate어플리케이션이 ..
프로젝트에서 CRUD 로직을 리팩토링하면서 URI에 대한 고민을 하게 되었습니다.고민하면서 제대로 URI 규칙에 대해서 알아야겠다는 생각에 글을 쓰게 되었습니다. URI인터넷 자원을 나타내는 고유 식별자이다. URI의 I는 Identifier로 인터넷 자료의 ID를 뜻하는 것이다.이는 자료 간 URI는 유일해야한다는 것이다. 규칙#1 URI 마지막에 '/'가 포함되면 안된다.URI 경로의 마지막에 있는 슬래시(/)는 의미를 더하지 않으며 혼란을 초래할 수 있으므로, 이를 사용하는 것은 중요한 규칙 중 하나입니다.따라서 URI 마지막에 '/'를 붙이면 안된다.예를 들어 http://api.test.com/test/ 와 http://api.test.com/test 있다고 했을 때 웹 컴포넌트와 프레임워크..
Kafka로 채팅을 구현하기 앞서 Kafka에 대해서 공부하기 위해 Kafka를 간단하게 연동해보는 실습을 해보겠습니다.Kafka 란?파이프라인, 스트리밍 분석, 데이터 통합 및 미션 크리티컬 애플리케이션을 위해 설계된 고성능 분산 이벤트 스트리밍 플랫폼이다. pub/sub 모델의 메시지 큐 형태로 동작하며 분산환경에 특화되어있다.큐잉 모델브로커(서버) 안에 메시지 큐가 존재한다.producer는 큐로 메시지를 보내고, consumer가 큐에서 메시지를 추출한다.하나의 큐에 여러개 컨슈머가 접근할 수 있어서 병렬 처리가 가능하다.하나의 메시지는 하나의 Consumer에서만 처리된다.pub/sub 모델producer를 publisher, consumer를 subscriber로 명명한다.publisher가 ..
kafka를 활용해서 채팅을 구현하기 전에 카프카에 대한 간단한 예제로 연습하려고 하였으나 다음과 같은 에러가 발생하였습니다 ㅠㅠ에러발생org.springframework.context.ApplicationContextException: Failed to start bean 'org.springframework.kafka.config.internalKafkaListenerEndpointRegistry'해당 에러는 Kafka 설정에서 문제가 발생했다는 에러라고 한다. 즉, Kafka Config 파일에서 문제가 있어서 발생한 에러이다. 해결제일 먼저 도커로 실행하고 있는 카프카와 주키퍼 상태를 확인했다.kafka, zookeeper 컨테이너가 제대로 작동 중인지 확인하기 위해 다음과 같은 명령어를 사용했..
지난 포스팅에서 websocket만으로 채팅을 단순하게 구현했다면 이번에는 좀 더 나은 채팅을 위해 STOMP를 적용하게 되었습니다.(1편을 실수로 삭제했네요.. 빠른 시일 내에 복구하겠습니다....)WebSocket만으로 채팅 구현STOMP를 활용한 채팅 구현Redis를 활용한 채팅 구현채팅 고도화 STOMP란Simple Text Oriented Messaging Protocol의 약자로 메시지 전송을 위한 프로토콜이다.STOMP는 클라이언트와 서버 간 전송할 메시지의 유형, 형식, 내용들을 정의한 규칙으로 TCP 또는 WebSocket과 같은 양방향 네트워크 프로토콜을 기반으로 동작한다.STOMP에서 Message Payload에는 Text or Binary데이터를 포함할 수 있다.STOMP는 pu..
실수로 삭제한 글 다시 써봅니다... (수정, 삭제 버튼 잘 구분해서 클릭해야겠어요...)여행 관련 서비스르 개발하면서 WebSocket으로 채팅을 구현하면서 WebSocket에 대해서 공부할 겸 글을 써보려고 합니다.WebSocket만으로 채팅 구현STOMP를 활용한 채팅 구현Redis를 활용한 채팅 구현채팅 고도화이번 포스트는 WebSocket으로만 채팅을 구현하려고 합니다. WebSocket이란?개념WebSocket은 클라이언트와 서버를 연결하고 실시간으로 통신이 가능하도록 하는 프로토콜이다.웹소켓은 하나의 TCP 접속에 전이중 통신 채널을 제공한다.쉽게 보면, WebSocket은 Socket Connection을 유지한 채로 실시간으로 양방향 통신 혹은 데이터 전송이 가능한 프로토콜이다.또, W..