Spring 65

fetch = FetchType.LAZY 지연로딩이란?

fetch = FetchType.LAZY는 연관된 엔티티를 로딩할 때 "지연 로딩(Lazy Loading)" 방식을 사용하도록 지시하는 옵션입니다. 지연 로딩이란, 연관된 엔티티가 실제로 사용될 때까지 로딩을 지연시키는 것입니다. 기본적으로 @OneToMany와 @ManyToMany 관계에서는 지연 로딩이 기본값이지만, 명시적으로 설정하려면 fetch = FetchType.LAZY 옵션을 사용할 수 있습니다. 지연 로딩을 사용하는 이유는 다음과 같습니다: 성능 최적화: 연관된 엔티티를 사용하지 않을 경우에도 즉시 로딩(Eager Loading)을 사용하면 쿼리가 추가적으로 발생하여 성능에 영향을 줄 수 있습니다. 지연 로딩을 사용하면 필요한 경우에만 연관된 엔티티를 로딩하므로 성능을 개선할 수 있습니다...

Spring 2023.04.19

Java의 boolean 타입의 변수에 대한 게터 메서드

Java의 규칙에 따라, boolean 타입의 변수에 대한 게터 메서드는 is 접두사를 사용합니다. 따라서 isReserved 필드의 게터 메서드는 isReserved()가 되어야 합니다. 이렇게 하면 다음과 같이 메서드를 사용할 수 있습니다: getIsReserved()와 같은 형식은 일반적이지 않으며, Java 규칙을 따르지 않습니다. 그러나 실제로 작동하지 않는 것은 아니며, 개발자가 직접 정의할 수도 있습니다. 하지만 일반적인 규칙을 따르는 것이 좋습니다. 이 경우에는 isReserved() 메서드를 사용하는 것이 적절합니다.

Spring 2023.04.19

@OneToMany에서 Many에 해당하는 컬럼은 mysql에 보일까?

스프링부트 엔티티에 @OneToMany @NonNull private List seats; 이런 칼럼이 있는데 mysql에서 select * from reservation; 하면 이 칼럼이 안보여 이게 정상인가? 이것은 정상입니다. @OneToMany 관계는 엔티티 간의 관계를 나타내기 때문에 데이터베이스 스키마에 해당 칼럼이 직접적으로 나타나지 않습니다. 대신 OneToMany 관계에서는 보통 별도의 연관 테이블이 사용되며, 이 테이블에는 관계를 나타내는 외래 키가 포함됩니다. 예를 들어, Reservation 엔티티와 Seat 엔티티 사이에 OneToMany 관계가 있고, Reservation 테이블에는 seats 칼럼이 없습니다. 대신 Seat 테이블에는 reservation_id와 같은 외래 키 ..

Spring 2023.04.19

컨트롤러에서 @RequestBody @RequestPart 의 차이

@RequestBody를 사용하여 JSON 데이터를 받을 수 있지만, 이 경우 단일 JSON 객체만 전송할 수 있습니다. 여기서는 JSON 객체와 함께 이미지 파일을 함께 전송하고자 한다면, 멀티파트 요청을 사용해야 합니다. 멀티파트 요청에서는 @RequestPart 어노테이션을 사용하여 JSON 데이터와 파일을 동시에 처리할 수 있습니다. 만약 이미지 파일을 전송하지 않고 JSON 데이터만 전송하는 경우, @RequestBody를 사용할 수 있습니다. 그러나 여기서는 이미지 파일과 JSON 데이터를 함께 전송하려고 하는 것으로 이해했기 때문에, @RequestPart를 사용하여 멀티파트 요청을 처리하는 것이 적절합니다.

Spring 2023.04.19

양방향 순환참조

순환참조의 해결방법1 @JsonManagedReference와 @JsonBackReference는 Jackson 라이브러리에서 사용하는 애노테이션입니다. 이러한 애노테이션들은 양방향 관계가 있는 엔티티들 사이에서 순환 참조(Circular Reference) 문제를 해결하는 데 사용됩니다. 순환 참조 문제는 한 엔티티에서 다른 엔티티를 참조하고, 그 참조된 엔티티가 다시 처음 엔티티를 참조할 때 발생합니다. 이로 인해 직렬화(Serialization) 과정에서 무한 루프에 빠질 수 있습니다. 이 문제를 해결하기 위해 Jackson에서는 @JsonManagedReference와 @JsonBackReference 애노테이션을 제공합니다. 예를 들어, 다음과 같은 양방향 관계가 있다고 가정해보겠습니다. 여기서..

Spring 2023.04.19

@OneToOne에서 순환참조해결 -DTO사용

순환 참조 문제를 해결하지 않고 양방향 @OneToOne 관계를 사용하는 경우가 있습니다. 그 예시는 DTO(Data Transfer Object)를 사용하는 경우입니다. DTO를 사용하여 엔티티를 JSON으로 변환하고, 순환 참조가 발생하지 않도록 엔티티 간 관계를 정의할 수 있습니다. 예를 들어, 아래는 양방향 @OneToOne 관계를 가진 Person과 Address 엔티티와 이에 대응하는 DTO 클래스입니다. @Entity public class Person { @Id @GeneratedValue private Long id; private String name; @OneToOne(mappedBy = "person") private Address address; } @Entity public cl..

Spring 2023.04.19

java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing :

여기서 문제는 객체가 저장되지 않은 transient 상태를 가리키고 있는데, flush 작업을 수행하기 전에 이 객체를 저장해야 한다는 것입니다. 예외에서 언급된 대로, fourman.backend.domain.reservation.entity.Seat.reservation이 fourman.backend.domain.reservation.entity.Reservation 객체를 참조하고 있습니다. 이 transient 객체를 저장해야 에러가 해결됩니다. 해결 방법: Reservation 객체를 생성하고 저장하기 전에 Seat 객체를 참조하도록 설정합니다. Reservation 객체를 저장하고, 저장된 객체의 ID를 사용하여 Seat 객체를 업데이트합니다. 참조하는거에따라 생성순서가 중요하다

Spring 2023.04.19

JPA 특정 엔티티에서 조인된 엔티티 검색

d.donateId = ?1는 JPQL (Java Persistence Query Language) 쿼리의 일부로, Donate 엔티티의 donateId 속성이 메서드 매개 변수로 전달된 donateId와 같은지를 확인합니다. 여기서 ?1은 첫 번째 메서드 매개 변수를 나타냅니다. @Query("SELECT d.member FROM Donate d WHERE d.donateId = ?1") 쿼리의 전체 의미는 다음과 같습니다: SELECT d.member: Donate 객체 d에서 member 속성을 선택합니다. FROM Donate d: Donate 엔티티에 대한 별칭(alias)으로 d를 사용합니다. WHERE d.donateId = ?1: 조건 절은 Donate 객체 d의 donateId 속성이 첫..

Spring 2023.04.19

PathViariable 과 RequestParam 차이

@DeleteMapping("/{productId}") public void productRemove(@PathVariable("productId") Long productId) { log.info("productRemove()"); productService.remove(productId); } 여기서 @PathVariable대신에 @RequestParam으로 바꿀수 있을까? 네, @RequestParam을 사용할 수 있습니다. 하지만, 두 어노테이션은 약간 다른 방식으로 작동하므로 코드를 약간 수정해야 합니다. @PathVariable은 URL 경로의 일부로 전달되는 값을 가져올 때 사용됩니다. 위의 코드에서는 productId가 경로의 일부로 포함되어 있습니다. 예를 들어, /product/123과..

Spring 2023.04.19