싱글톤이란

  • 인스턴스를 한 개만 만들기
  • 클래스의 인스턴스가 단 하나만 필요한경우
  • 싱글톤 - 요소를 한개밖에 가지고 있지 않은 집합

Singleton 클래스

  • 인스턴스를 1개 밖에 만들수 없음
  • static 필드로서 Singleton클래스의 인스턴스에서 초기화됨 (Singleton 클래스 로드시 1회만 실행)
  • 생성자는 private로 되어있음
    • 왜? 외부에서 생성자의 호출을 금지하기 위해서
    • 만약 new로 한다면 ? 싱클돈 패턴이 아님 (싱글톤은 클래스에서 단 하나의 인스턴스만 존재하는 것이기 때문)

 


싱글톤 예제

요소 설명

  • - : Singleton이 private임
  • 밑줄 : 메소드가 static 메소드임

 

싱글톤 예제

[ static 란? ]
전역, 정적 이라고함
해당 데이터의 메모리 할당을 컴파일 시간에 하는것
런타임중 필요할때마다 동적으로 메모리를 할당 하는 것이아니라 데이터는 프로그램 실행 직후부터 끝날 때까지 메모리 수명이 유지

- static: 변수인스턴스 간에 데이터 공유가 필요한 상황
- static final: 클래스 내부 또는 외부에서 참조의 용도로만 선연
- static 메소드: 인스턴스를 생성하지 않아도 static 메소드 호출 가능
- public static void main: 자바에서 메인 메소드 실행할때 사용인스턴스의 생성과 상관없이 JVM에 의해 호출되므로 static무조건 선언 해야함 cf ) final 변수한번 값이 결정되었다면 변경이 불가능
- final 클래스: 상속을 허용하지 않음
- final 메소드: 오버라이딩을 허용하지 않음

소스 코드

  • 정말 같은 메모리를 사용하는 것인지 확인하기위한 예제
  • Main.java
package Singleton;

public class Main {
    public static void main (String[] str) {
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        if(s1==s2) {
            System.out.println("같음");
            System.out.println(s1);
            System.out.println(s2);
        } else {
            System.out.println("다름");
        }
    }
}

 

  • Singleton.java
package Singleton;

public class Singleton {
    // static 프로그램 실행전에 하나메모리에 할당해서 끝날때까지 유지가됨
    // 왜 static인가? 외부에서 호출하는것을 금지하기위해 -> 싱글톤이라는 의미는 해당 클래스에서 인스턴스가 딱 한개만 존재하는것
    private static Singleton singleton = new Singleton();
    private Singleton() {
        System.out.println("인스턴스 생성");
    }
    public static Singleton getInstance() {
        return singleton;
    }
}

싱글톤 클래스내 같은 객체로 사용한다

Singleton각각의 역할

  • Singleton 패턴에는 Singleton의 역할만 존재

    ⇒ 유일한 인스턴스를 얻기 위한 static 메소드를 가짐 (언제나 동일한 인스턴스 반환)

왜 사용하는가?

  • 싱글톤 패턴은 인스턴스 수를 제한함으로서 복수의 인스턴스가 존재하면 서로 영향을 미치고 뜻하지 않는 버그가 발생할 수 있기에 인스턴스가 1개만 있다 라고 보증 하는 것이다

싱글톤에서 인스턴스 생성시점

  • 프로그램 실행후 인스턴스를 얻는 함수 호출하면 static필드 초기화 되면서 인스턴스가 생성됨

싱글톤 인스턴스 생성 시점


연습문제

  1. 싱글톤 패턴 적용
  • 매번 객체 생성 코드
  • TicketMater.java
package Singleton;

public class TicketMater {
    private static TicketMater ticketMater = new TicketMater();
    private static int ticket = 100;

    public static int getNextTicket() {
        return ticket++;
    }

    public static TicketMater getInstance() {
        return ticketMater;
    }
}
for(int i=0 ;i<10;i++) {
            int ticketMater = TicketMater.getNextTicket();
            System.out.println(TicketMater.getInstance() +"||" +ticketMater);
        }
  • result

싱글톤 예제 1

  1. 싱글톤 패턴이 아닌이유

다수의 스레드가 동시 실행되면 다수 인스턴스가 생성될 가능성이 있음

solv1 ) 복수 인스턴스 생성을 막기위해 sleep 추가

  • Singleton.java
private static Singleton singleton = null;
    private Singleton() {
        System.out.println("create");
        slowdown();
    }
    public static Singleton getInstance( ) {
        if(singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
    private void slowdown() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
        }
    }

solv2 ) 동기화를 이용해 엄격한 싱글톤 패턴 적용

  • Singleton.java
private static Singleton singleton = null;
    private Singleton() {
        System.out.println("create");
        slowdown();
    }
    public static synchronized Singleton getInstance( ) {
        if(singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
    private void slowdown() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
        }
    }
synchronized 란?
- 자바로 프로그래밍 하다보면 멀티 스레드가 발생해서 동기화를 제어해야하는 상황이 생김
- 동시성을 제어

'Study(Language)' 카테고리의 다른 글

[Design Pattern] FactoryMethod Pattern  (0) 2021.01.04

Factory Method

  • 하위 클래스에서 인스턴스 작성하기

  • 인스턴스를 생성하는 공장을 Template Method패턴으로 구성하는 것이 Factory Method패턴

  • Template Method 패턴 이란?

    하위클래스에서 구체적으로 로직이 들어가는 패턴

  • 인스턴스를 만드는 방법을 상위 클래스 측에서 결정하지만 구체적인 클래스 이름까지는 결정하지 않음

  • 구체적인 내용은 모두 하위 클래스에서 수행
    ⇒ 인스턴스 생성을 위한 골격과 실제 인스턴스를 생성하는 클래스를 분리해서 생각하는 패턴

  • 디자인 패턴 중 생성 패턴에 포함

생성 패턴이란?

  • 시스템이 어떤 Concrete Class를 사용하는지에 대한 정보를 캡슐화함
  • 클래스의 인스턴스 들이 어떻게 만들어지고 어떻게 결합하는지에 대한 부분을 완전 가려준다
    ⇒ 생성패턴을 이용하면 무엇이 생성되고, 누가 생성하며, 어떻게 생성되는지, 언제 생성할 것인지에 대한 유연성을 확보할 수 있음

  • 주의깊게 봐야하는것

  • 여기에서 Factory, Product 클래스는 framework라는 패키지 소속

  • IDCard, IDCardFactory 클래스는 구체적인 내용을 구현하여 idcard라는 패키지에 소속

각각의 class의 역할

    추상적인 골격 ⇒ framework , 구체적인 내용 ⇒ idcard

Creator(작성자) 역할

  • 예제에서는 Factory 클래스가 작성자 역할을함

    예제에서 createProduct는 인스턴스 생성을 위한 메소드

  • 실제로 생성하는 ConcreateProduct에 가지고 있는 정보가 없고 Product와 인스턴스 생성의 메소드를 호출하면 Product가 생성되는 것 뿐이다

  • new를 사용해서 실제 인스턴스를 생성하는 것 대신, 인스턴스 생성을 위한 메소드를 호출해서 구체적인 클래스 이름에 의한 속박에서 상위 클래스를 자유롭게 만듦

Product(제품) 역할

  • 예제에서 Product 클래스가 제품 역할을함
  • famework에 포함
  • 생성되야하는 인스턴스가 가져야할 인터페이스(API)를 결정하는 것 ⇒ 추상클래스
  • 구체적인 내용은 하위클래스인 ConcreteProduct 역할
  • Product를 생성하는 추상 클래스는 framework

ConcreteCreator.java (구체적인 작성자)

  • 예제에서는 IDCard가 구체적인 작성자 역할을 함
  • idcard
  • 구체적인 제품을 만드는 클래스

ConcreteProduct.java (구체적인 제품)

  • 예제에서는 IDCardFactory 클래스가 구체적인 제품 역할을함
  • 구체적인 제품
  • idcard

예제

  • Main.java
package FactoryMethod;

import FactoryMethod.framework.Factory;
import FactoryMethod.framework.Product;
import FactoryMethod.idcard.IDCardFactory;

public class Main{
  public static void main(String[] args) {
    Factory factory = new IDCardFactory();
    Product card1 = factory.create("김카드");
    Product card2 = factory.create("이카드");
    Product card3 = factory.create("박카드");

    card1.use();
    card2.use();
    card3.use();
  }
}
  • Factory.java
package FactoryMethod.framework;

// import FactoryMethod.idcard.IDCard;
// Template Method 패턴이 사용되는 class
// 제품을 실제로 만들고 등록하는 구현은 하위클래스에서 함
// Tempplte Method 패턴 - 하위 클래스에서 구체적으로 처리하는 패턴
public abstract class Factory {
    public final Product create(String owner) {
        Product p = createProduct(owner);
        // Product p = createNew(owner);
        registerProduct(p);
        return p;
    }
//     자바의 특징 -> 접근지정자 (protected, public, private) => 캡슐화
//     createProduct : 인스턴스 생성을 위한 메소드
//     new로 실제 인스턴스를 생성하는 대신 인스턴스 생성을 위한 메소드를 호출해서 구체적인 클래스 이름에 의한 속박에서 상위 클래스를 자유롭게함
//    protected Product createNew (String owner) {
//        return new IDCard(owner);
//    }
    protected abstract Product createProduct(String owner);
    protected abstract void registerProduct(Product product);
}
  • Product.java
package FactoryMethod.framework;
// FactoryMethod.framework 는 제품에 대해서 표현한 패키지, 사용 생성 이런것
public abstract class Product {
    public abstract void use();
}
  • IDCardFactory.java
package FactoryMethod.idcard;
import FactoryMethod.framework.*;
import java.util.*;

public class IDCardFactory extends Factory {
    private List owners = new ArrayList();

    @Override
    protected Product createProduct(String owner) {
        return new IDCard(owner);
    }

    @Override
    protected void registerProduct(Product product) {
        owners.add(((IDCard)product).getOwner());
    }
    public List getOwners() {
        return owners;
    }
}
  • IDCard.java
package FactoryMethod.idcard;
import FactoryMethod.framework.*;
// 인식 카드를 나타내는 클래스
public class IDCard extends Product {
    private String owner;

    // 생성자
    public IDCard(String owner) {
        System.out.print(owner + "카드 만듦\n");
        this.owner = owner;
    }
    @Override
    public void use() {
        System.out.print(owner + "카드 사용\n");
    }

    public String getOwner() {
        return owner;
    }
}

왜 사용해야 하는가?

  • 팩토리 패턴은 클라이언트 코드로 부터 서브 클래스의 인스턴스화를 제거해서 서로 간의 종속성을 낮추고, 결합도를 느슨하게해서 호가장을 쉽게함

  • 만약 framework패키지를 이용해서 제품과 공장을 만든다고 가정

    TV의 클래스 Television과 TV공장 TelevisionFactory를 만든다고 하면 framework 패키지를 import한 별도의 Television 패키지를 만들게됨

    ⇒ 이때 framework 패키지를 수정하지 않아도 전혀 다른 제품과 공장을 만들수 있다

    ⇒ 즉. framework패키지는 내용을 수정할 수 없다

    ⇒ 왜? framework 패키지 안에 idcard 패키지를 import하지 않음

    ⇒ 이로 알수 있는점 : framework 패키지는 idcard패키지에 의존하고 있지 않음

Factory.java의 createProduct 메소드 구현방법

  1. 추상메소드

    하위 클래스가 반드시 이 메소드를 override해야함

  2. 디폴드의 구현

    디폴트 구현을 준비하고 하위 클래스에서 구현하지 않을 때 사용

    이 경우 Product를 new해서 사용하므로 Product를 추상클래스로 놓을수 없다

  3. 에러이용

    FactoryMethodRuntimeExecption이 별도로 작성되어야함

    하위클래스에서 구현하지 않을 경우에 실행시 에러 발생

추상 클래스

  • 클래스간의 공통점을 찾아내서 공통의 부모를 설계하는 작업
  • 아직 구현되지 않은 클래스를 포함한 것으로 무조건 자식클래스에서 재구현해서 인스턴스 화해야한다
  • 없거나 하나 이상의 추상 메소드(아직 구현되어 있지 않은 abstract로 정의된 메소드)를 가지고 있는 것
  • 추상 클래스는 생성자는 가질수있음 하지만
  • 인스턴스를 만들수 없지만 추상클래스를 상속받은 클래스를 통하면 인스턴스화 가능함

왜 사용하는가?

  • 부모 클래스에서 공통 부분의 구현과 설계가 완료되면 자식이 상속받아 기능 확장 가능
  • 자식 클래스에서 추상클래스를 반드시 구현해야함
  • 공통 사항이 한곳에서 관리되어 개발 및 유지보수 용이
  • 부모 추상 클래스에서 기본 생성자가 없으므로 하위 클래스에 사용 된 생성자는 부모 생성자를 명시적으로 호출해야함

참고

 

디자인 패턴(Design Pattern)이란?

객체지향 소프트웨어를 '잘' 설계한다는 것은 쉬운 일이 아닙니다. 게다가, 재사용할 수 있는 객체지향 소프트웨어를 만드는 것은 더 힘듭니다. 설계를 할 때에는 지금 당장 갖고 있는 문제를 해

readystory.tistory.com

 

[JAVA/자바] 추상 클래스(abstract class), 추상 메소드

이번 포스팅은 추상 클래스에 대해서 알아보도록 하겠다. 추상이란 말처럼 공통적인 특성이나 속성들을 추...

blog.naver.com

 

'Study(Language)' 카테고리의 다른 글

[Design Pattern] Singleton  (0) 2021.01.07

기본

  • 안드로이드를 프로젝트를 세팅했을 때
  • 프로젝트 이름으로 titleBar가 생성되는 것을 볼 수 있다.
  • 하지만 커스텀하게 titleBar을 만들수가 없어 titleBar가 없는 App이 많다

TitleBar 없애는 법

  • 처음 세팅시 생기는 /res/values/styles.xml

    • 해당파일은 프로젝트 스타일 세팅 파일
        <resources>

        <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
          <!-- Customize your theme here. -->
          <item name="colorPrimary">@color/colorPrimary</item>
          <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
          <item name="colorAccent">@color/colorAccent</item>
        </style>
  • title Bar을 없애고 싶은 경우 아래 코드를 추가 해주면 된다

    <resources>
    
      <!-- Base application theme. -->
      <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
          <!-- Customize your theme here. -->
          <item name="colorPrimary">@color/colorPrimary</item>
          <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
          <item name="colorAccent">@color/colorAccent</item>
      <!--        no titleBar    -->
          <item name="windowActionBar">false</item>
          <item name="windowNoTitle">true</item>
      </style>
    

```

Text

  • TextView
    • dp 보다는 sp를 권장(디바이스의 기본 텍스트 사이즈에 따라 바뀌어야 하기 때문)
  • Plain text
    • 단순 text
  • Password
  • Password (Numeric)
    • 숫자만 입력 가능
  • E-mail
  • Phone
  • Postal Address
  • Multiline Text
  • Time
  • Date
  • Number
  • Number (Signed)
    • 부호 있는 수
  • Number (Decimal)
    • 십진법
  • AutoComplete TextView
    • 자동 완성 검색
  • MultiAutoCompleteTextView
    • 두개 이상의 문자열 자동 완성 검색
  • CheckedTextView
  • TextInputLayout
    • html 의 textarea 와 비슷

Buttons

  • Button
  • ImageButton
  • ChipGroup
  • Chip
  • CheckBox
    • 여러개 선택 가능
  • RadioGroup
    • radiogroup 내 radiobutton 이 있어야지 선택 가능
  • RadioButton
    • 딱 하나만 선택
    • radiogroup에 포함안되어 있으면 라디오 버튼의 의미가 없어짐
  • ToggleButton
  • Switch
  • FloatingActionButton
    • 화면에 둥둥 떠있는 버튼
    • 고정되어 있는 버튼

Widgets

  • View
    • div와 약간 비슷?
  • ImageView
  • WebVIew
  • VideoView
  • CalenderVIew
  • ProgressBar
  • ProgressBar (Horizontal)
  • SeekBar
  • SeekBar (Discrete)
    • 어디 위치인지 보여줌
  • RatingBar
  • SearchView
  • TextureView
  • SurfaceView
  • Horizontal Divider
  • Vertical Divider

Containers

Google

  • AdView
    • 앱에 광고 달기
  • MapView
    • 구글 맵

Legacy

  • GridLayout
  • ListView
  • TabHost
  • RelativeLayout
    • 상대에 따라 위치가 달라지는 레이아웃
  • GridView

'Study(Language) > Android' 카테고리의 다른 글

[안드로이드] titleBar 없애는법  (0) 2020.06.17
[안드로이드] 6대 레이아웃  (0) 2020.06.05
[안드로이드] 4대 컴포넌트  (0) 2020.06.03
[안드로이드] 매니페스트  (0) 2020.06.02

레이아웃 정의

  • 사용자 인터페이스를 위한 구조

종류

  • relative layout

  • linear layout

  • frame layout

  • table layout

  • listVIew 와 GridView

Linear Layout

  • 가로 또는 세로 정렬 레이아웃
  • 중첩 X, 지정 방향으로만 쌓임
  • width 는 %, px가 아닌 비율

Relative Layout

  • 자식 View와의 상대적인 위치
  • toRightOf : 오른쪽 배치
  • below : 아래 배치
  • alignParentLeft : 왼쪽 정렬
  • centerInParent : 중앙 정렬
  • 다중 Linear layout로 구성되어 있는것을 relative layout게 강력하지만 만들기 다소 어려움

Frame Layout

  • 모달같이 여러화면을 중첩으로 구현할때 사용
  • 가장 최근에 추가된 뷰만 보임
  • Fragement 동일한 위치에서 다양한 뷰를 교체로 표현하고 싶을 떄

Table Layout

  • html table 과 비슷 하지만 행과 열을 합칠수 없고 td역할 하는게 없음

ListView and GridView

  • 동일한 뷰를 안에 컨텐츠만 다르게 반복해야하는 경우
  • List : 상하로 펼쳐지는 것
  • Grid : 차곡히 좌에서 우로 펼쳐지는 것 레아이웃 넘으면 아랫줄로
  • for문 사용한 것과 같은 뷰 반복 효과

ConstraintLayout

  • linear 와 relative 로 레이아웃을 구현하기 다소 복잡한 면이 있어 constraintLayout을 많이씀

  • 중첩 가능

    <Button android:id="@+id/button1" ...
           app:layout_constraintRight_toRightOf="parent" />
  • 의미

    • layout 을 constraint로 할건데 parent의 오른쪽으로 배치할것임
  • 두개의 뷰를 연결하고 싶으면 chain사용

  • 배치 방법

    • 형태 - layout_constraint[기준1]_to [기준2]of=[viewId / parent]
    • 예시
      • layout_constraintLeft_toLeftOf
      • layout_constraintLeft_toRightOf
      • layout_constraintRight_toRightOf
      • layout_constraintRIght_toLeftOf
      • layout_constraintTop_toTopOf
      • layout_constraintTop_toBottomOf
      • layout_constraintBottom_toTopOf
      • layout_constraintBottom_toBottomOf
      • layout_constraintStart_toStartOf
      • layout_constraintStart_toEndOf
      • layout_constraintEnd_toStartOf
      • layout_constraitnEnd_toEndOf
  • 한쪽으로 치우치게 (bias)

    • 0~1값
    • default = 0.5
    • layout_constraintHorizontal_bias
    • layout_constraintVertical_bias
  • 레이아웃을 빠져나간 경우

    • default = false
    • layout_constraintedWidth = [true / false ]
    • layout_constraintedHeight = [true / false ]

주의사항

  • top/bottom/right/left 를 다 사용해야하지는 않지만 필수는 아니지만 레이아웃이 깨질수도 있어 확실하게 하기위해서는 네개다 명시하는 것을 지양해야함

  • MATCH_CONSTRAINT

    • 부모 뷰에 꽉맞추고 싶을 때

      <Button anroid:layout_width="wrap_content"
            // wrap_content 와 같은 기능
            app:layout_constraintWidth_min 
            app:layout_constraintHegith_min
            app:layout_constraintWidth_max
            app:layout_constraintHeight_max
            // 0 1사이 값을 입력해서 비율로 길이 결정 ex- 0.2
            app:layout_constraintWidth_percent
            app:layout_constraintHeight_percent
      >
  • CHAIN

    • 뷰끼리 연결시 간격을 정하고 싶은 경우 사용
    • 뷰끼리 연결할 떄
    • 수평 가장 왼쪽에 있는 값이 기준 (HEAD)
    • 요소
      • layout_constraintHorizontal_chianStyle
      • layout_constraintVertical_chainStyle
    • 스타일
      • CHAIN_SPREAD - 모든 여백을 같게함
      • CHAIN_SPREAD_INSIDE - CHAIN_SPREAD와 같지만 양끝은 부모에 붙임
      • CHAIN_PACKED - 묶어버리고 부모 여백을 같게함

cf
layout은 기본적으로 chain으로 연결되어있다 그래서 위아래로 연결하고 싶은경우
layout_constraintTop_toButtomOf 로 연결하면 위아래로 연결된다
내가 한 실수
layout_constraintBottom_toTopOf 까지 연결하면 위에 값이랑 아래값이 연결된다는 소리를 아니다

4대 컴포넌트란?

  • activity
  • service
  • receiver
  • provider

activity

  • 사용자에게 보이는 UI화면
  • activity 역할을 위해서는 자바의 Activity 클래스를 상속 받아야함
  • 액티비티의 생명주기 메소드를 재정의하여 원하는 기능 구현
  • 가장 많이 사용
  • 특징
    • 안드로이드 어플리케이션은 하나 이상의 액티비티를 가져야함
    • 두가지 액티비티 동시 display불가
    • 분할 가능, 타 액티비티 호출 가능

service

  • 백그라운드에서 실행되는 것
  • 화면에 보이지는 않지만 manifest에 등록해야함
  • 특징
    • 따로 화면이 없음
    • 한번 시작된 서비스는 백그라운드에서 종료되어도 실행
    • 모든 service클래스 상속 받아 사용
    • 네트워크를 통해 데이터 가져옴

content provider

  • 데이터 관리 및 다른 어플리케이션에 데이터 제공
  • 디비 관련 데이터 전달시
  • 특징
    • 파일 입출력, sql등으로 데이터 관리
    • provider을 통해 다른 어플리케이션에 데이터 전달 가능

broadcast receiver

  • 안드로이드의 이벤트와 반응관련 정보 받아 반응
    cf ) 브로드 캐스팅
  • 하나의 메시지를 받아 여러곳에 공유
  • push 알림

intent

  • 통신 수단 역할
  • 4가지의 구성요소(컴포넌트)간의 작업수행을 위한 정보전달 역할

영속성 관련 이슈

응답 값으로 엔티티를 직접 노출 한 경우

문제점

  • 엔티티의 모든 값 추가
  • 응답 스팩을 맞추기 위한 로직 추가
  • api스팩에 대한 변경에 대응하기 어려움

Fetch Join

장점

  • SQL 한번으로 연관된 엔티티를 함께 조회할 수 있어 SQL 호출 횟수를 줄여 성능 최적화 가능

단점

  • 1대 다 fetch join 페이징 불가능
  • 컬렉션 둘 이상의 패치조인 사용하면 안됨 ⇒ 데이터가 부정합하게 조회 될수 있음

ex)

em.createQuery(
    "select o from Order o join fetch o.member m join fetch o.deleveryd",Order.class
).getResultList();

distinct

  • jpa 의 distinct는 디비의 distinct 엔티티의 중복인 경우 중복을 걸러서 보내줌

페이징 처리를 하며 Collection 한계 돌파

  • ToOne(OneToOne, ManyToOne)모두 패치 조인

  • 컬렉션은 지연 로딩으로 조회

  • 지연 로딩을 최적화 하기위해 hibernate.default_batch_fetch_size (inquery 갯수)/ @BatchSize 둘중 하나 사용

  • @BatchSize : 개별 최적화

  • hibernate.default_batch_fetch_size : 글로벌 설정

  • 이 옵션을 사용하면 컬렉션이나, 프록시 객체를 한꺼번에 설정한 size만큼 IN쿼리로 조회

  • 한계 )

em.createQuery(
    "select distinct o from Order o" + 
    "join fetch o.member m "+ //order 입장 패치 가능
    "join fetch o.delivery d "+  // order 입장 패치 가능
    "join fetch o.orderItems oi " //order 입장 패치 불가능  ToOne관계 아님
    "join fetch oi.item i", Order.class)  // 1대n 관계 관련으로 패치조인 불가능
  • 해결책)
public List<orderDto> order(@RequestParam(value="offset", default
em.createQuery(
    "select o from Order o"+
    "join fetch o.member m" +
    "join fetch o.delivery d", Order.class)
    .setFirstResult(offset)
    .setMaxResults(limit)
    .getResultList();
)

결론

  • ToOne관계는 패치조인 사용
  • 나머지는 hibernate.default_batch_fetch_size 로 최적화 (max : 1000 min:100)

'Study(Language) > JPA' 카테고리의 다른 글

[JPA] 트렌젝션  (0) 2020.06.03

트랜잭션

트랜잭션의 성질

원자성

  • 한 트랜잭션 내에서 실행한 작업들은 하나로 간주한다. 즉, 모두 성공 또는 모두 실패

일관성

  • 트랜잭션은 일관성 있는 디비 상태를 유지

격리성

  • 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리

지속성

  • 트랜잭션을 성공적으로 마치면 결과가 항상 저장되야함

'Study(Language) > JPA' 카테고리의 다른 글

[JPA] 영속성  (0) 2020.06.03

+ Recent posts