전체 글
N+1 문제란?
N+1 문제란 무엇일까? 연관관계가 있는 엔티티를 조회할 경우 조회된 데이터의 갯수(N) 만큼 조회 쿼리가 추가로 발생하는 문제 N+1 문제 발생 이유 JpaRepository 가 JPQL 로 쿼리를 실행할 때는 Fetch 전략을 따르지 않고 JPQL 자체만을 이용하기 때문이다. JPQL 은 엔티티 객체와 필드를 가지고 쿼리를 한다. JPQL 입장에서는 연관관계를 모르고 해당 엔티티를 기준으로만 쿼리를 만든다. 그렇기 때문에 연관된 엔티티 데이터가 필요한 경우, Fetch 전략으로 지정한 시점에 조회를 별도로 호출하게 된다. 해결 방법 Fetch join 정의 JPQL 을 이용하여서 DB에서 데이터를 가져올 때 처음부터 연관된 데이터까지 같이 가져오게 하는 방법 단점 연관관계 설정해놓은 Fetch 전략을..
Spring DI 란?
Spring DI 란? DI 란? 구체적인 구현체에 의존하지 않고 추상화된 객체에 의존하게 하여 결합도을 낮추는 것. 구현체에 의존하게 되면 사용하는 구현체가 변경되었을 때 구현체를 사용하는 코드의 변경이 생기게 됨. 이는 OCP 를 위반함. 추상화된 객체에 의존하게 하고 구현체를 외부에서 주입해주면 사용하는 코드의 변경이 필요 없게 됨. 이를 의존성 주입(DI) 라고 함. Spring 에서의 DI 스프링에서는 구현체를 주입해주는 외부가 IOC 컨테이너임. 먼저 빈을 등록하고, 각 빈에 필요한 의존성을 주입해준다. 개발자는 빈에 해당하는 객체들을 작성하고, 그 빈에 필요한 의존성은 Spring 에서 주입해주고 호출하기에 이를 제어의 역전(IOC) 라고 함.
템플릿 메서드 패턴
템플릿 메서드 패턴이란? 💡 특정 작업을 처리하는 일부분을 서브 클래스로 캡슐화하여 전체적인 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내용을 바꾸는 패턴입니다 우리가 흔히 패턴이라고 인식하지 않고 쓰는 패턴이다. 라면을 끓이는 단계를 템플릿 메서드 패턴의 예시로 들어보겠습니다. public abstract class RamenRecipe { final void prepareRamen() { preparePot() // 냄비 준비 boilWater(); // 물을 끓이기 putBasicMaterial(); // 기본 면, 스프 넣기 if(addMore()) { addIngredient(); // 더 넣고 싶은 것 넣기 } } void preparePot() { System.out.println("냄비..
추상 팩토리 패턴
추상팩토리 패턴이란? 💡 서로 관련있는 객체들을 묶어서 팩토리를 만들고, 이 팩토리들을 조건에 따라 생성하도록 다시 팩토리를 만들어서 객체를 생성하는 패턴 예시를 들자면, 컴퓨터를 만들 때, 마우스, 키보드가 필요합니다. 그리고 그 제조사들로 삼성과 lg가 있다고 해봅시다. 하나의 컴퓨터는 당연하게 하나의 제조사로 이루어져야합니다 어제 공부했던 팩토리메서드 패턴을 이용해서 이 상황을 해결해봅시다. 일단 Lg, 삼성 키보드 클래스를 만들고 Keyboard 인터페이스를 정의합니다. 그리고 입력된 조건에 따라 구현체를 만들어주는 KeyboardFactory를 만들어줍니다. public interface Keyboard { } public class SamsungKeyboard implements Keyboar..
팩토리메서드 패턴
팩토리 메서드 패턴이란? 💡 부모 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며, 자식 클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴 특정 상황에서 조건에 따라서 부모 클래스의 구현체를 다르게 하여 생성해야할 때가 있습니다. 클라이언트에서 조건에 따라 분기하여 생성하면 되겠지만, 클라이언트가 많아진다면 어떨까요? 분기하여 생성하는 로직의 코드가 클라이언트마다 반복되고, 추가적인 분기점이 생긴다면 모든 클라이언트 코드를 수정해야하는 일이 생깁니다. 예시를 한번 들어 보겠습니다. 계산기로 예시를 들어보겠습니다. 최상위 클래스인 TokenType는 계산식을 잘랐을 때 존재할 수 있는 타입의 종류를 의미합니다. TokenType의 구현체에 따라서 하는 일이 다른데, 그래서 클라이언트에서 Toke..