MultipleBagException의 발생 원인과 해결 방법
·
Project 하면서 알아가는 것들
서론이번에는 JPA를 사용하면서 발생한 MultipleBagException 오류와 해결하는 방법에 대해서 알아보도록 하겠습니다. 구조AppUser@Getter@Setter@ToString@Entity@Table(name = "app_user")public class AppUser { ... @OneToMany(mappedBy = "user") private List boards; @OneToMany(mappedBy = "user") private List comments;} AppUserRepository@Query( "SELECT u FROM AppUser u" + " JOIN FETCH u.boards b" + ..
JPA의 N + 1 문제를 알아보고 해결하자
·
Project 하면서 알아가는 것들
서론다른 사람이 짠 JPA Query를 보면서 N + 1 문제가 발생하는 코드를 발견하였고,  이를 해결하고 말로만 듣던 N + 1 문제가 정확히 어떤 것을 의미하는지를 알아보겠습니다. JPA의 동작 원리먼저, N + 1의 문제를 확인하기 전에 알면 이해에 도움되는 간단한 JPA의 동작 원리에대해 알아보겠습니다.기본적인 동작은 위와 같이 작동합니다. 하지만, 여기서 Fetch 전략에 따라 연관 Entity 처리 방식이 바뀌게 됩니다.Fetch 전략의 기본 값은 EAGER입니다. EAGER조회한 Entity에서 연관 Entity가 있다면 즉시 로딩하는 전략입니다.먼저, 해당 Entity를 가져와고 연관된 Entity가 있다면 확인 후 개별적으로 Query를 보내게 됩니다. LAZY조회한 Entity에서 연..
@Transactional의 readonly와 OSIV는 뭐 하는 친구일까?
·
Project 하면서 알아가는 것들
서론Spring Boot 프로젝트를 하면서 궁금했던 Transactional의 readOnly와 그와 자주 언급되는 OSIV에 대해서 알아보는 시간을 가지겠습니다. Dirty Checking개념Transactional과 OSIV에 대해서 이야기 전에 가장 먼저 알아야할 개념입니다.JPA는 특정 Entitiy가 영속성 컨텍스트에 로드될 때 초기 상태를 스냅샷을 찍고, 트랜잭션이 종료될 떄 찍은 스냅샷과 비교합니다. 만약, 스냅샷과 다른 상태라면 자동으로 업데이트를 해주는 것을 말합니다. 스냅샷 (SnapShot)사진을 찍는다의 의미로, JPA에서는 Entity 특정 시점의 원본 상태를 저장해둔 복사본을 의미한다.이러한, 스냅샷은 메모리에서만 존재하는 특징을 가진다. 코드// 트랜잭션 시작@Transacti..
[Spring Boot + Python] Kafka를 사용해보자
·
Project 하면서 알아가는 것들
이전 글에서는 Kafka와 RabbitMQ의 이론에 대해서 알아보았다.이번에는 프로젝트에서 사용한 Spring boot + Python을 Kafka와 연결하여 사용하는 방법에 대해서 설명하고자 한다. 해당 포스트는 이론적인 부분은 모두 제외되었기 때문에, 이론부터 공부를 하고자 한다면 이전 글을 참고하길 바랍니다. Kafka와 RabbitMQ를 알아보자이번에 알아볼 Kafka와 RabbitMQ는 두 어플리케이션, 프로세스 등 간의 메세지를 교환할 때 사용하는 플랫폼입니다.첫 번 째 게시글은 Kafka와 RabbitMQ에 대해 이론적으로 알아보고, 다음 게시글은 Sprinseungyong20.tistory.com 해당 관련 코드들은 모두 Github에서 확인하실 수 있습니다. blog/kafka at ma..
Kafka와 RabbitMQ를 알아보자
·
Project 하면서 알아가는 것들
이번에 알아볼 Kafka와 RabbitMQ는 두 어플리케이션, 프로세스 등 간의 메세지를 교환할 때 사용하는 플랫폼입니다.첫 번 째 게시글은 Kafka와 RabbitMQ에 대해 이론적으로 알아보고, 다음 게시글은 Spring boot + Python을 사용하여 Kafka로 통신하는 방법에 대해서 알아볼 것입니다. 메시지 큐 (MQ)먼저, Kafka와 RabbitMQ에 대해서 알아보기 전 필수적인 개념인 메시지 큐에 대해서 알아보겠습니다. 정의 프로세스 또는 프로그램 인스턴스가 데이터를 서로 교환할 때 사용하는 통신 방법 독립적인 애플리케이션과 서비스에서 정보를 교환할 수 있도록 지원하며, 한 애플리케이션이 큐에 메세지를 보내고, 다른 애플리케이션이 큐에서 메시지를 받아 사용하는 통신 방법입니다.즉, 발신..
[Nextjs] Tiptap 사용법과 커스텀마이징 기능 구현
·
Project 하면서 알아가는 것들
소스 코드 보기https://github.com/seungyong/blog/blob/main/tiptap/README.md Tiptap이란?공식 문서 사이트에서는 Tiptap을 다음과 같이 소개하고 있습니다. Tiptap is an open source headless content editor and real-time collaboration framework to craft exactly the content experience you’d like to have Tiptab은 사용자가 원하는대로 정확하게 만들 수 있는 오픈 소스 헤드리스 텍스트 편집기이자 실시간 협업 프레임워크입니다.Headless란?사용자 인터페이스를 갖고 있지 않는 것을 의미합니다. 즉, 사용자 인터페이스를 가지지 않고, 텍스트 ..
IoC, DI, DPI 확실히 개념 잡기
·
Project 하면서 알아가는 것들
IoC (제어의 역전) 정의 제어 흐름이 반전되는 디자인 원칙으로, 시스템의 제어 흐름을 외부 컨테이너나 프레임워크로 전환하는 것을 말합니다. 이것은 라이브러리와 프레임워크의 큰 차이점이기도 합니다. 라이브러리는 개발자가 언제 사용할지 결정하는 제어권을 갖지만 프레임워크는 내가 작성한 코드를 제어하고, 대신 실행해주므로 제어권을 프레임워크가 갖게 됩니다. 쉽게 말해, 제어권이 누구한테 있냐의 문제라고 보시면 됩니다. IoC가 필요한 이유 class PotatoPizza { public void make() { System.out.println("포테이토 피자를 만듭니다!"); } } class PizzaShop { private PotatoPizza potatoPizza; public PizzaShop(..
REST API 확실히 개념 잡기
·
Project 하면서 알아가는 것들
오늘 소개할 것은 대충 어떻게 사용하는지만 보고 확실한 개념을 잡지 않았던 REST API에 대해서 알아볼 것이다. 용어 정의 클라이언트 웹에서 정보에 액세스하려는 모든 것을 사용자라고 한다. 클라이언트는 API를 사용하는 사람이 될 수도 있고 소프트웨어 시스템일 수도 있다. 리소스와 서버 리소스는 API를 통해 클라이언트에게 제공하는 정보이다. 리소스는 이미지, 동영상, 텍스트, 숫자 또는 모든 유형의 데이터일 수도 있습니다. 또한 클라이언트에 리소스를 제공하는 시스템을 서버를 말한다. API 애플리케이션 프로그래밍 인터페이스(API)는 다른 소프트웨어 시스템과 통신하기 위해 따라야하는 규칙을 말한다. 개발자는 다른 애플리케이션이 프로그래밍 방식으로 애플리케이션과 통신할 수 있도록 API를 표시하거나 ..