[동시성 제어] DB 락 vs Redis vs 비동기
·
Side Project/Study Together
✏️ 서론Study Together는 유저들이 함께 모여 공부할 수 있는 플랫폼으로, 효율적인 학습 환경을 제공하고자 기획했다. 유저가 Study Group 기능을 통해 공부 모임에 자유롭게 참여가 가능하다. 그러나, 다수의 유저가 동시에 Study Group에 참여하려고 할 때, 동시성 문제가 발생할 수 있다. 동시성 문제란, 여러 작업이 동시에 수행될 때 공유 자원에 대한 접근 순서나 처리 과정이 엉키며 데이터 일관성 및 시스템 안정성이 깨지는 현상이다. 현재 내 프로젝트에서 동시성 문제가 발생할 수 있는 지점을 파악하고, 이에 대한 해결 방안을 모색해 보았다. 짧은 과정은 아니었기에, 우선 요약을 하자면 나의 목표는 무조건적인 대규모 트래픽에 대비한 동시성 제어가 아닌, 현재 프로젝트 규모를 예측..
HTTP 버전 및 HOL Blocking에 대하여
·
Programming/Network
HTTP/1.0하나의 연결당 한개의 요청만 처리하도록 설계되었다. 서버로부터 파일을 가져올때마다 3-way handshake를 계속해서 열어야 했기 때문에 RTT가 증가하는 단점이 있다.RTT (Round Trip Time) : 네트워크 패킷이 송신 측에서 수신 측으로 전달되고, 다시 송신 측으로 돌아오기까지 걸리는 시간. RTT 증가를 해결하기 위한 방법1. 이미지 스플리팅이미지를 여러개의 작은 조각들로 나누어 효율적으로 전송하는 방식이다. 필요한 부분만 전송하여 불필요한 RTT를 감소한다. 2. 코드 압축코드를 압축해서 개행문자, 빈칸 등을 없애 코드의 크기를 최소화 하는 방식이다. 3. 이미지 Base 64 인코딩이미지 파일을 64비트로 이루어진 문자열로 인코딩 하는 방식이다. 일반적으로 웹 페이지..
[JPA/Hibernate] Flush 차이
·
Programming/Spring,JPA
FlushJPA와 Hibenate의 flush 동작은 개념적으로 동일하지만, 구현의 세부 사항에서 차이가 있다. JPA flushJPA는 표준 사양으로 구현체가 다양한데 Hibernate가 그 중 하나이다. JPA의 flush 는 엔티티 매니저를 통해 수행되며 아래와 같은 경우에 호출된다.트랜잭션이 커밋될 때JPQL 쿼리 실행 전명시적으로 flush 호출 Hibernate flushHibernate는 JPA 구현체 중 하나로, JPA 사양을 따르면서도 자체적으로 flush 실행 시점을 좀 더 세밀하게 제어한다. Hibernate에서 flush가 호출 되는 경우는 아래와 같다.트랜잭션을 커밋하기 전에 트리거 된다.JPQL 쿼리 결과가 영속성 컨텍스트의 변경 사항에 영향을 받을 수 있을 때, 쿼리를 실행하기..
[JPA] JPA 상속관계 매핑(@Inhertinace)
·
Programming/Spring,JPA
JPA 상속관계 매핑JPA 상속 관계 매핑이란, 객체지향 언어의 상속 개념을 데이터베이스 관계형 모델에 맞게 구현하는 기능이다.JPA는 객체 모델에서 상속 구조를 데이터베이스에 적절하게 매핑하기 위해 세 가지 전략을 제공한다.Joined TableSingle TableTable per ClassJPA에서 상속을 매핑할 때는 상위 클래스에 @Inheritance 어노테이션을 추가해 사용하며, 상속 전략을 지정할 수 있다.@Entity@Inheritance(strategy = InheritanceType.SINGLE_TABLE)public abstract class Product { @Id @GeneratedValue private Long id; private int price;} 1. Joined Tab..
[Java] 익명 클래스와 람다(Lambda) 정리
·
Programming/Java,Back-end
익명 클래스(Anonymous Class)익명 클래스란?익명 클래스는 상속 받는 클래스를 명시적으로 별도의 Java 파일을 통해 클래스를 만드는 것이 아닌, 코드 내부에 이름이 존재하지 않는 클래스를 만드는것이다. 예시 코드public class Coffee { public void make() { System.out.println("Make!!"); }}public class Main { public static void main(String[] args) { // TODO : Coffee 클래스를 상속 받는 익명 클래스 Coffee coffee = new Coffee() { // make 메서드 오버라이드 ..
[Test Code] Repository 단위 테스트로 다져가는 도메인 중심 설계의 기초
·
Side Project/Study Together
Repository 단위 테스트를 진행하기 전에, 1. Repository Layer의 명확한 정의,  그에 따라 2.Repository Layer에서는 무엇을 단위 테스트 해야하는지 고민해보았다. Repository Layer는 무엇을 하는 계층일까?Repository 계층은 도메인을 영속화 하는 계층이다. 리포지토리 패턴은 소프트웨어 개발에 사용되는 설계 패턴으로 도메인 모델 계층과 구현 기술을 분리시키는 것을 의미한다. 데이터 액세스 코드를 추상화하여 구체적인 접근 방식을 가림으로써 깨끗한 아키텍처를 유지할 수 있다. 리포지토리 계층은 도메인과 data source layer 간에 중개자 역할을 수행하게 되는데, 영속성 장치에서 쿼리의 결과로 받아온 데이터를 repository에서는 도메인에서 사용..