org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: fourman.backend.domain.member.entity.Member.authentications, could not initialize proxy - no Session

이 방식으로 해결이 되는데 DTO를 쓰는 방법도 있다고한다.
새로운 DTO 객체를 사용하는 경우:
필요한 정보만 포함하는 새로운 DTO 객체를 만들고, getSeats 메서드에서 해당 DTO 객체를 반환하도록 수정합니다.
예를 들어, 클라이언트에게 Seat 및 관련 정보만 반환하는 경우 새로운 SeatResponse DTO를 만듭니다.
java
Copy code
public class SeatResponse {
private Long id;
private String seatNumber;
// 필요한 다른 정보
// 생성자 및 getter, setter
}
그런 다음 getSeats 메서드에서 SeatResponse DTO 객체로 변환하고 반환합니다.
java
Copy code
@Transactional
public List<SeatResponse> getSeats() {
List<Seat> seats = seatRepository.findAll();
return seats.stream()
.map(seat -> new SeatResponse(seat.getId(), seat.getSeatNumber() /*, 다른 필요한 정보*/))
.collect(Collectors.toList());
}
이렇게 하면 반환되는 JSON에서 authentications 필드가 제거되고, 문제가 해결됩니다. 또한 이 방법은 성능에 더 좋은 영향을 미칩니다.
선생님이 하는 방법-join fetch사용

@@@구글검색으로 찾은방법
Fetch join
DAO 레이어에서 join 으로 관계된 엔티티를 함계 조회한 후 상위 레이어에 전달하는 방법이다. 보통 함께 사용하는 Spring data 만으로는 어렵고 JPQL 이나 QueryDSL 을 사용해야 가능하다.
QueryDSL 을 사용할 경우의 예시이다.
public class UserRepositoryImpl extends QuerydslRepositorySupport ... {
private final JPAQueryFactory jpaQueryFactory;
...
public List<User> findByUsername(String username) {
var user = QUser.user;
var order = QOrder.order;
return this.jpaQueryFactory.selectFrom(user)
.join(order).on(order.userId.eq(user.userId))
// fetchJoin 메소드로 order 값을 가져오도록 한다.
.fetchJoin()
.where(...)
.fetch();
}
}
...
public List<User> getUsers(String username) {
var user = this.userRepository.findByUsername(username);
// 이미 DAO 레이어에서 orders 를 가져온 상태로 반환 했기 때문에 동작한다.
var orders = users.getOrders();
...
return users;
}
이 방법은 사용하는 라이브러리와 개인 / 그룹의 취향과 규약에 따라 다양한 방법이 있을 수 있다.
@EntityGraph
마지막 방법은 EntityGraph annotation을 사용하는 것이다. 예시를 보자.
개인적으로 가장 선호하는 방법이다.
@Entity
public class User {
@Id
...
@OneToMany(fetch = FetchType.LAZY)
private List<Order> orders;
}
...
public interface UserRepository extends JpaRepository<User, Long> {
// 불러올 데이터의 변수명을 설정해준다. 배열로 한번에 여러 값을 설정 할 수 있다.
@EntityGraph(attributePaths = { "orders" })
Optional<List<User>> fetchUsers();
}
...
public List<User> getUsers {
var user = this.userRepository.findByUsername(username);
// @EntityGraph 없다면 orders를 불러 올 수 없어 LazyInitializationException 이 발생한다.
var orders = users.getOrders();
...
return users;
}
다른 사람의 구현을 보거나 서로의 접근 방법을 공유하면서 발전 시켜 나가면 오류 없는 행복한 개발을 할 수 있을 것이다.
출처:https://velog.io/@oenomel87/JPA-LazyInitializationException