본문 바로가기
관리자

Programming-[Backend]

(419)
[TIL] Read and Write, Read Only Database 분리 | Read After Write Consistency Read After Write Consistency(쓰기 직후 읽기 일관성)1개의 DB에 부하가 몰리는 것을 방지하기 위해서 RW(Read and Write), RO(Read Only) DB를 나눠놓는다.조회만 하는 API는 RO에서 처리하도록, create, update, delete가 일어나는 API는 RW에서 처리하도록 한다.그리고 RW -> RO로 자동적으로 Sync가 되도록 한다. 이 때, sync에는 시간이 걸리기 때문에 클라이언트 측에서 write 직후 read를 하면 ro DB에서 생성된 데이터를 찾을 수 없어서 에러가 난다. • ⁃ 이를 방지하기 위해서 Read/Write Pinning | Session Pinning | Master Stickness 등의 용어로 부르는, RW 디비에 ..
[TIL] Redis Replica와 Cluster 사용 상황 정리 보통 HA(High Availability)를 위해 master - slave 인스턴스를 둔다. 이 때는 클러스터 모드가 아니여도 괜찮고, AWS에서는 최소 7GB 메모리 성능으로 사용할 수 있다.클러스터 모드로 한다면, 여러 노드가 샤딩이 된다. redis key값을 기반으로 slot 개념으로 hashing 된다. 예를 들어 0 - 8196, 8197 - 16382 로 slot이 나뉘어서 key에 따라 slot이 설정되고, slot 범위에 맞게 node로 데이터가 배치된다. • 샤딩 시에도 HA를 위해서 샤딩된 각 노드에 대해 master - slave 구조를 둔다. 만약 클러스터 모드로 처리하면, key-value insert를 할 때 여러 노드에 배치되는 데이터를 한 번에 넣을 수 없다. 따라서 ..
[TIL] Soft Delete hibernate, @SQLRestriction 배경JPA에서 Soft delete 방식을 적용하기 위해 전체 엔티티의 상위 엔티티에 deleted_at 컬럼을 적용하고 상속받는 구조로 만든다. 그러나 이렇게 처리했을 때, 모든 엔티티들을 처리하는 쿼리문에서 deleted_at을 신경써줘야한다는 문제점이 발생한다.@Getter@Setter@MappedSuperclass@SuperBuilder@NoArgsConstructor@AllArgsConstructor@Audited@EntityListeners(AuditingEntityListener.class)public abstract class BaseEntityAbstract implements Serializable { @NotAudited @Column(name = "deleted_at") ..
Querydsl MultiDataSource 설정 시 유의사항 1. DataSource 설정 방법JPA로 여러 데이터베이스를 참조해야하는 경우, JPA에서 바라보는 데이터베이스를 설정해주는 값, 그에 맞는 트랜잭션 매니저, 엔티티 매니저 설정을 아래처럼 설정해줘야한다. 예를 들어 Abc, Def 도메인에 대해 설정하는 경우 아래처럼 설정한다. @Configuration@EnableTransactionManagement@EnableJpaRepositories( basePackages = "com.project.domain.abc", entityManagerFactoryRef = "abcEntityManagerFactory", transactionManagerRef = "abcTransactionManager")public class AbcDataSou..
keycloak service account 설정 방법(ver 26.2.1~) service account service account 방식은 client가 token을 갖고 resource server에 요청하는 방식이 아니라, resource server간 자원을 요청하기 위한 통신을 목적을 갖는다. 이때 keycloak 설정에 대해서 간략히 기록해둔다. keycloak public client 설정보통 아래 그림과 같은 구조로 클라이언트 - 서버 구조를 만들어두고 keycloak을 이용하여 인증한다. resource server를 keycloak client로 등록할 때, public client로 standard flow만 체크하여 OAuth 2.1의 authentication flow가 적용되도록 한다. Service Account 설정: Credential Clien..
[작성중] Enum 사용: @Converter 적용하기 배경Enum을 사용하면 규격화된 스펙으로 특정 속성값들을 편리하게 처리할 수 있다. 클래스처럼 사용할 수도 있어서 내부에 관련된 값과 메서드들을 선언하여 캡슐화하여 코드를 관리할 수도 있다. public enum UploadStatus { PROCESSING, DONE, FAIL public static UploadStatus from(...) { return ... }} 만약 mysql을 사용한다면 DB에서 enum 타입 자체를 지원하지는 않기 때문에 다음과 같이 Entity에 해당 타입을 선언하면서 @Enumerated를 선언해준다. 그러면 내부적으로는 Enum을 통해 규격화되고, 통일성 있는 타입으로 사용할 수 있으면서도 DB에는 String으로 처리되어 들어..
[TIL] 양방향 연관관계 복습 + Instancio + cascade 객체지향적으로 JPA를 사용하기 위해 필요하다. 역방향 조회 시 절차지향적으로 코딩하는 것을 안하기 위함이다.-> 양방향 연관관계가 없다면, TeamRepository.find -> MemberRepository.find를 통해 Team에 속한 Member 들을 찾아야하는데, Team 엔티티 내부에 List members를 두고 양방향 연관관계를 맺어두었다면, 엔티티 탐색처럼 team.getMembers()로 멤버 조회 가능-> 양방향 관계를 만들면 @toString, @JsonBackRefrence 등을 처리해줘야하는 번거로움은 있다. 다만 이 내용은 역참조를 할 때의 편리성과 상충되는 것이다. 역참조를 한 번 만들어두면, 사용자들은 편하게 사용할 수 있다. 단방향이라면 각 Repository를 의존해..
Count, 동시성 제어 관리(Lock, Redis, Kafka): 선착순 이벤트 시스템 인프런의 실습으로 배우는 선착순 이벤트 시스템 강의를 듣고나서 정리하는 내용이다. 동시에 많은 사용자가 몰려서 서버에 요청을 보냈을 때, 쿠폰 등 개수에 대한 정합성을 어떻게 확보할 것인지 알아본다. 그리고 DB에 부하가 되지 않게 할려면 어떻게 해야하는지 알아본다. 강의에서는 선착순으로 쿠폰을 발급하는 이벤트를 개최하는 상황을 예시로 든다. 요구사항은 아래와 같다.1. 쿠폰은 선착순 100명에게만 발행된다.2. 순간적으로 몰리는 트래픽을 견딜 수 있어야한다. Lock1번 요구사항을 달성하기 위해 가장 간단하게 적용할 수 있는 방법은 Lock이다. 아무런 추가 인프라 없이 JPA의 @Lock 어노테이션을 이용하여 Pessimistic Lock을 걸면 된다. 이 방법은 한 스레드가 접속하여 DB를 업데이..