현제의 현재이야기

[spring] FetchType에 대하여 본문

JAVA

[spring] FetchType에 대하여

현재의 현제 2023. 4. 13. 23:44
package com.example.domain.domain;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.*;
import java.net.URL;

@Entity
@Getter @Setter
@NoArgsConstructor
public class Result {
    @Id @GeneratedValue
    @Column(name = "result_id")
    private Long id;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "question_id")
    private Question question;

   
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
    private Member member;

    @Enumerated(EnumType.STRING)
    private AnswerStatus answerStatus;

    private String audio;

    public static Result createResult(Question question, Member member, String audio) {
        Result result = new Result();
        result.setQuestion(question);
        result.setMember(member);
        result.setAudio(audio);
        result.setAnswerStatus(AnswerStatus.WAITING);
        return result;
    }

}
  • 영환님이 ManyToOne이나 OneToOne을 할 때, fetch 전략을 LAZY로 해야 호율적이라고 하셨다.
  • 왜냐하면 Result 엔티티가 Question 엔티티와 많은 관계를 가지고 있다면, 모든 Result를 검색할 때마다 모든 Question을 가져오기 때문이다.
  • 그런데 문제점이 발생했다.

ㅇ
반갑다 시리얼라이저!

  • 여기서 LAZY 때문에 member가 로드되지 않고 직렬화를 시도하면 .. 어떤 hibernate 프록시 개체가 반환되는 오류라고 한다.
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
  • 그래서 이걸 넣으면 LAZY 로딩 전략도 지키고 직렬화도 가능하단다.
package com.example.domain.controller;

import com.example.domain.domain.Result;
import com.example.domain.service.ResultService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;


@RestController
@RequiredArgsConstructor
public class ResultController {
    private final ResultService resultService;
    @GetMapping("/result/{memberId}")
    public ResponseEntity<List<Result>> getResultsByMemberId(@PathVariable Long memberId) {
        List<Result> results = resultService.findResult(memberId);
        return ResponseEntity.ok().body(results);
    }

}

 

'JAVA' 카테고리의 다른 글

[Spring] Json에 포함되는 필드  (0) 2023.04.14
[Spring] null 값 처리와 HTTP response  (0) 2023.04.07
[JAVA SPRING] 0314 TIL  (0) 2023.03.14
[JAVA] JAVA Static과 Python global과의 차이점  (0) 2023.03.10
기초문법 1일차  (0) 2023.03.08
Comments