아래 예시로 설명 하도록 한다.
@Data
class A{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(fetch=FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name="a_id")
private List<B> bList;
}
@Data
class B{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(fetch=FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name="a_id")
private Long a_id;
A 와 B 객체는 One to many 관계이다.
또한 Lombok 의 @Data 를 사용하였다.
발생한 이슈
A 객체리스트를 가져오기 위해 아래와 같이 repository 의 findAll 을 사용하였고, 서비스 단에서 해당 서비스를 호출 하였다.
Repository
public interface A extends JpaRepository<A,Long>{
List<A> findAll();}
Service
@Service
public class AService{
public List<A> findAll() throws Exception {return aRepository.findAll();
}
}
위와 같이 서비스의 findAll() 을 호출 할 경우 B 의 객체 리스트까지 모두 가져오게 된다.
본인은 A 객체 리스트만 가져오고 싶었으나 , 의도치않게 B 의리스트가지 다 가져옴으로써 속도에 저하가 생겼음.
확인 결과 Lombok 사용을 남발하여 저런 현상을 겪게 되었다.
@Data 는 내부적으로 Getter/Setter 를 사용하게 되는데 , 이것이 문제 였다.
Getter 를 사용함으로써 A 객체만 가져올것을 내부적으로 @Getter 를 호출 하기 때문에 B 의 리스까지 가져오게 되었다.
해결 방법:
@OneToMany 사용시 FetchType.LAZY 로 사용한 후 필요한 경우에만 Getter 를 하도록 한다.
즉 A 객체만 가져올 경우에는 B 객체는 필요하지 않으므로 List<B> 에 대한 Getter 는 생성하지 않도록 하였다.
'SpringBoot' 카테고리의 다른 글
JPA 와 JDBCTemplate 저장 속도 비교 (0) | 2017.09.28 |
---|---|
JPA saveIterable 과 save 저장 속도 (1) | 2017.09.28 |
xml convert to object (0) | 2017.08.26 |
Java 8 ArrayList sort (0) | 2017.08.10 |
영문과 숫자를 조합한 랜덤키 만들기 (0) | 2017.08.02 |