본문 바로가기

웹개발/spring

(3)
스프링부트 redis 동시성 관리 [리뷰+리뷰댓글] 리뷰와 리뷰댓글 엔티티가 있다.1번 리뷰의 리뷰댓글을 작성하면 1번 리뷰의 리뷰댓글 컬럼이 +1로 업데이트 되는 단순한 작업을 하려고 한다.문제는 동시에 다수가 1번 리뷰에 대한 댓글을 작성할때 문제가 일어난다.100명이 동시에 1번 리뷰에 댓글을 달면 리뷰의 리뷰댓글 필드는 100이 되어야 하는데 ,동시성 이슈가 발생해 기대값인 100이 아닌 12로 업데이트 된 것을 확인할 수 있었다. 이에 프로젝트에 레디스를 이미 사용중이기에 레디스를 이용한 동시성 제어를 했다.방식은 Lettuce로 스프링부트에 Redis를 사용하기 위해 아래 의존성을 추가하면 기본적으로 제공되는 클라이언트 이다.implementation 'org.springframework.boot:spring-boot-starter-data-r..
[엔티티 설계] @ElementCollection 사용 예시 상품과 상품 이미지가 있다.상품하나에 상품 이미지가 0~n장 까지 존재할 수 있다.그렇다면 상품과 상품 이미지는 일대다 관계로 엔티티를 구성할 수 있다.하지만 DB 테이블 설계 시 상품테이블은 상품마다 상품ID를 가지고상품 이미지는 상품 이미지만의  ID를 가지지 않고 PK가 (상품ID, 상품이미지UUID )라면    상품이미지를 @Entity를 사용하지 않고 @ElementCollection를 사용할 수 있다.DB에 상품1개 상품이미지가 2개 있다고 가정 시 테이블 구조는 아래와 같다.   코드로는 다음과 같다. 상품 엔티티 코드 (상품 이미지 클래스에 @ElementCollection 어노테이션 사용)@Entity@Table(name = "tbl_product")@Getter@ToString(excl..
EntityManager 주입 방식 - 생성자 주입 vs 필드 주입 생성자 주입@Repository@RequiredArgsConstructorpublic class 클래스명 { private final EntityManager em;} lombok의 @RequiredArgsConstructor 어노테이션은 final로 정의된 필드를 기반으로 생성자를 자동으로 만들어 준다.그리고 기본적으로 스프링에서 생성자가 하나뿐이면 자동으로 주입해준다.또한 생성자,필드, 수정자 주입 중 스프링에서는 생성자 주입을 가장 권장한다.  - 필드 주입@Repositorypublic class 클래스명 { @PersistenceContext private EntityManager em;} 가장 간결하게 주입할 수 있는 방법이다.@PersistenceContext 어노테이션 말고..