본문 바로가기

Spring & Java

JPA 사용시 Lombok 의 Data 어노테이션 사용 이슈

반응형


아래 예시로 설명 하도록 한다.


@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  는 생성하지 않도록 하였다.







반응형

'Spring & Java' 카테고리의 다른 글

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