Spring 65

리뷰 등록 때 마다 별점 평균 계산하여을 엔티티의 칼럼에 넣어줘야할까? 아님 조회 때 마다 계산해서 조회해야할까?

스프링 부트의 카페 엔티티에 별점 칼럼을 추가하고 계속 업데이트하는 방식: 장점: 별점이 필요한 경우 바로 사용할 수 있어 응답 시간이 빠릅니다. 데이터베이스에 저장된 별점이 최신 상태이므로, 추가 연산이 필요 없습니다. 단점: 별점이 수정될 때마다 카페 엔티티를 업데이트해야 하므로, 데이터베이스에 부하가 발생할 수 있습니다. 실시간으로 별점을 계산하는 것이 아니므로, 최신 정보가 반영되지 않을 수 있습니다. 별점을 요청할 때마다 계산해서 가져오는 방식: 장점: 별점 정보가 항상 최신 상태로 유지됩니다. 데이터베이스에 별점 칼럼을 추가할 필요가 없으므로, 데이터베이스 구조가 단순해집니다. 단점: 별점을 요청할 때마다 별점을 계산해야 하므로, 서버의 부하와 응답 시간이 증가할 수 있습니다. 결론적으로, 어..

Spring 2023.04.24

JPA) QueryCreationException해결: id와 JPA레포지토리 메서드명

이렇게 엔티티를 정의해두고 아래와 같이 써야된다. QueryCreationException은 스프링 데이터 JPA에서 쿼리 메소드를 생성하는 과정에서 문제가 발생했음을 나타내는 예외입니다. 여기에서 발생한 문제는 FavoriteRepository 인터페이스의 findByMemberIdAndCafeId 메소드에 대한 쿼리를 생성하는 도중 'id'라는 속성을 찾을 수 없다는 것입니다. No property 'id' found for type 'Cafe'; Traversed path: Favorite.cafe 이 메시지는 Favorite 엔티티의 cafe 필드를 기준으로 id라는 속성을 찾을 수 없음을 나타냅니다. 코드를 살펴보면 Cafe 엔티티에는 cafeId라는 속성이 있습니다. 따라서 FavoriteRe..

Spring 2023.04.24

트래픽에 따른 페이징 처리

두 가지 방법 모두 장단점이 있습니다. 어떤 방법이 더 효율적인지는 애플리케이션의 요구 사항과 구조에 따라 달라집니다. 모든 게시물을 한 번에 요청하고, Vue.js 내에서 페이징 처리하기: 장점: 페이지를 전환할 때마다 서버에 요청하지 않아도 됩니다. 따라서 페이지 전환 시 빠른 응답이 가능합니다. 단점: 모든 데이터를 한 번에 가져오므로 초기 로딩 시간이 길어질 수 있습니다. 게시물 수가 많아질수록 로딩 시간도 길어집니다. 또한 클라이언트 메모리 사용량이 증가할 수 있습니다. 특정 페이지에 대한 부분만 서버에서 요청하기: 장점: 초기 로딩 시간이 짧고, 필요한 데이터만 요청하므로 서버와 클라이언트 간의 트래픽이 줄어듭니다. 게시물 수가 많아져도 로딩 시간에 큰 영향을 받지 않습니다. 단점: 페이지를 ..

Spring 2023.04.23

toast ui 사용시 이미지 처리

글내용과 이미지를 같이 content칼럼에 저장하면 데이터베이스에 위와같이 입력됩니다 Toast UI를 사용하여 이미지와 텍스트 내용을 content 변수에 저장하면, 이미지가 Base64로 인코딩되어 데이터로 포함됩니다. 이는 데이터베이스에 저장할 때 문제가 될 수 있습니다. 이미지 데이터는 크기가 크기 때문에 데이터베이스에 직접 저장하는 것은 권장되지 않습니다. 대신, 다음 두 단계를 수행하여 이미지를 처리하는 것이 좋습니다: 1.이미지를 서버에 업로드하고, 서버에서 이미지에 대한 URL을 생성합니다. 2.생성된 이미지 URL을 데이터베이스에 저장하고, 이 URL을 사용하여 이미지를 불러옵니다. 이 과정을 거치면 데이터베이스에 이미지 데이터 자체를 저장하지 않고 이미지 URL만 저장하게 되므로, 데이..

Spring 2023.04.23

fetch join 검색 후 중복된 데이터 반환 문제

->같은데이터가 중복 출력된다 Hibernate와 같은 ORM 프레임워크에서는 JOIN FETCH를 사용할 때 때때로 중복된 결과가 반환되는 경우가 있습니다. 이는 Hibernate가 데이터를 조회하고 객체로 매핑하는 방식과 관련된 문제입니다. JOIN FETCH를 사용하면 연관된 개체를 한 번의 쿼리로 모두 가져올 수 있지만, 이 때문에 데카르트 곱(Cartesian product)이 발생할 수 있습니다. 이는 모든 가능한 조합이 결과에 포함되기 때문에 중복된 결과가 발생할 수 있는 것입니다. 따라서 이 경우 DISTINCT 키워드를 사용하여 중복된 결과를 제거하는 것이 좋습니다. 이렇게하면 Hibernate가 중복을 제거한 후 올바른 결과를 반환할 수 있습니다 ->이렇게 수정 @Query("SELEC..

Spring 2023.04.22

LazyInitializationException에서 @JsonIgnore를 쓰면 안되는 경우

@JsonIgnore 어노테이션을 사용하면 해당 필드를 JSON 시리얼라이징 과정에서 무시할 수 있습니다. 이 경우 LazyInitializationException은 발생하지 않겠지만, 이 방법을 사용하면 JSON 응답에 eventBoardImageResourceList 필드가 포함되지 않게 됩니다. 따라서, 이 방법을 사용하면 클라이언트에게 이 정보를 전달할 수 없습니다. 이것이 원하는 결과라면 @JsonIgnore를 사용하여 문제를 해결할 수 있습니다. 그러나 이 정보를 클라이언트에게 전달하려면, 이전에 제안한 방법 중 하나를 사용하여 LazyInitializationException을 해결하는 것이 좋습니다. fetch join 을 이용하자 fetch join을 사용하여 Event 엔티티와 관련된..

Spring 2023.04.22

로컬 스토리지의 보안 취약성

로컬 스토리지를 사용하면 보안에 취약한 점이 있습니다. 로컬 스토리지는 클라이언트 측에서 JavaScript를 사용하여 쉽게 수정할 수 있으므로, 사용자가 브라우저 개발자 도구를 사용하여 로컬 스토리지의 값을 변경한 후 게시판에 글을 올리면 작성자가 변경될 수 있습니다. 이 문제를 해결하려면 서버 측에서 인증과 권한 검사를 수행해야 합니다. 로그인한 사용자의 정보(예: 닉네임)는 서버에서 관리하고, 게시글 작성 시 서버에서 사용자 인증을 확인한 후 해당 사용자의 닉네임을 게시글 작성자로 사용해야 합니다. 이렇게 하면 클라이언트 측에서 작성자를 변경하는 시도를 방지할 수 있습니다. 서버 측 인증을 위해 JWT(JSON Web Token) 같은 토큰 기반 인증 방식을 사용할 수 있습니다. 이 방식은 사용자가..

Spring 2023.04.20

CascadeType

CascadeType을 사용하여 관련된 엔티티를 함께 삭제할 수 있습니다. 이를 사용하면 관련된 객체가 함께 처리되므로 데이터 일관성을 유지할 수 있습니다. 예를 들어, reservation과 reservation_times 테이블 간에 @OneToMany 관계가 있다고 가정하면, Reservation 엔티티에서 다음과 같이 CascadeType 설정을 추가할 수 있습니다. @Entity public class Reservation { // ... @OneToMany(mappedBy = "reservation", cascade = CascadeType.ALL, orphanRemoval = true) private List reservationTimes; // ... } 이렇게 설정하면, reservati..

Spring 2023.04.19