Yeji's Tech Notes
article thumbnail
반응형

개요

"not initialize proxy - no session" Spring에서 Entity데이터를 DTO로 변환해서 가져오는 과정에서 위와 같은 문제가 발생했습니다. 이러한 문제가 생기는 원인과 해결방법에 대해서 정리해봤습니다. 

 

문제 발생 원인

Account 테이블에서 다중 값을 가질 수 있는 Column이 존재해 fetchType.LAZY형식의 데이터로 값을 저장했습니다. 

 

해결방법

1. FetchType.LAZY -> FetchType.EAGER 변경

2. @EntityGraph

3. Querydsl을 이용한 fetchjoin()

 

저는 2번째 방법을 선택해서 해결했습니다. 우선 LAZY에서 EAGER로 변경하는 것은 선호하지 않는 방법입니다.

1번째 방식으로 변경하면 불필요한 리소스가 발생하므로 가급적 하지 않는 방법입니다. 또한 3번째 방법은 Querydsl을 사용해 값을 가져올 경우 관계되어있는 갯수만큼 값이 생성되 별도의 group으로 묶어주는 작업을 수행해야 됩니다. 그러므로 시간도 절약되면서 리소스 절감도 되는 방식인 @EntityGraph 방식으로 가겠습니다.

 

- AccountRepository @EntityGraph 설정 추가

name : 추후 NamedEntityGraph사용할 이름 정의

@Transactional(readOnly = true)
public interface AccountRepository extends JpaRepository<Account, Long> {

    @EntityGraph("Account.withRolesAndTravelThemes")
    Optional<Account> findByEmailAndLoginType(String email, LoginType loginType);
    
}

 

- Account @Entity @NamedEntityGraph 설정 추가

name : @Entity에서 연관관계 정의를 위한 이름 정의

attributeNodes : 함께 조회할 속성 선택

@Entity
@NamedEntityGraph(name = "Account.withRolesAndTravelThemes", attributeNodes = {@NamedAttributeNode("roles"), @NamedAttributeNode("travelThemes")})
public class Account extends UpdatedEntity {
	
    /* 아이디 */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    ...
    
    /* 권한 */
    @ElementCollection(fetch = LAZY)
    @Enumerated(EnumType.STRING)
    @CollectionTable(name = "account_roles", joinColumns = @JoinColumn(name = "account_id"))
    private Set<AccountRole> roles = Set.of(AccountRole.USER);
    
    /* 여행 테마 */
    @ElementCollection(fetch = LAZY)
    @Enumerated(EnumType.STRING)
    @CollectionTable(name = "travel_themes_account", joinColumns = @JoinColumn(name = "account_id"))
    private Set<TravelTheme> travelThemes;
    
 }

 

참조

코드는 아래 링크에 Account, AccountRepository에 예시 표기되어 있습니다.

 

https://github.com/growth-genius/account-service

 

GitHub - growth-genius/account-service

Contribute to growth-genius/account-service development by creating an account on GitHub.

github.com

 

반응형
profile

Yeji's Tech Notes

@Jop

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!