[DB] 격리수준
·
DB
트랜잭션의 격리 수준(Isolation Level)이란 여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 여부를 결정하는 것이다. 트랜잭션의 격리 수준은 격리 수준이 높은 순서대로 SERIALIZABLE, REPEATABLE READ, READ COMMITTED, READ UNCOMMITED가 존재한다.격리 수준이 낮으면 의도했던 코드와 다르게 데이터가 변경될 수 있다. 격리 수준이 낮으면 변경으로 인한 부작용이 발생할 수 있고, 격리 수준이 높으면 시간당 처리할 수 있는 쿼리 수가 낮아지기 때문에 적절한 설정값을 고려해야 한다.발생할 수 있는 부작용 세 가지Dirty Read트랜잭션A에서 데이터 변경 후 커밋하기 전에 트랜잭션B에서 ..
동시성 이슈 해결하기
·
개발
문제 상황 : 동시에 여러 사용자가 쿠폰을 발급받을 때 발급 수량을 초과하면 안된다.목표 : 설정된 발급 수량만큼만 정확히 발급되도록 보장해야 한다.기술스택 : Spring Boot 3.x, Spring Data JPA, Postgresql16문제 상황쿠폰 발급 시나리오@Entity@NoArgsConstructor(access = AccessLevel.PROTECTED)@Getterclass Coupon { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) private String name; @Column(nullable = false) p..
[Book] 만들면서 배우는 클린 아키텍처 - 2
·
Book
만들면서 배우는 클린 아키텍처의 8장을 읽고 내용을 작성했다. 아직 정리하면서 이해까지는 하지 못했는데, 나중에 프로젝트에 여러 매핑 전략을 사용하면 체득이 될 것 같다.매핑 전략서로 다른 계층(웹, 애플리케이션, 도메인, 영속성 등)간 데이터가 어떻게 변환되고 전달될지를 정의각 계층이 자신의 관심사에만 집중할 수 있게 하고, 한 계층의 변경이 다른 계층에 미치는 영향을 최소화 해야한다.적절한 매핑 전략을 선택함으로써 단일 책임 원칙을 지키고, 코드의 유지보수성과 확장성을 높일 수 있다.매핑하지 않기 전략웹 계층의 웹 컨트롤러가 SendMoneyUseCase 인터페이스를 호출해서 유스케이스를 실행이 인터페이스는 Account 객체를 인자로 가진다웹 계층, 애플리케이션 계층, 영속성 계층 모두 동일한 모델..
[Java] 표준 예외를 사용하자
·
Language/Java
Effective Java의 72번째 항목으로 Exception, RuntimeException, Throwable, Error를 직접 재사용하지 말자는 내용이다. 이 예외들은 다른 예외들을 포괄하는 클래스이므로 안정적으로 테스트할 수 없다. 예외 처리 코드가 실제로 잡아야 할 구체적인 예외가 아닌 다른 예외도 함께 잡을 수 있기 때문이다.class Calculator { public static int add(final String text) { if (!StringUtils.hasText(text)) { throw new RuntimeException("Input text cannot be null or empty"); } // do so..
[Book] 만들면서 배우는 클린 아키텍처 - 1
·
Book
톰 홈버그 저/박소은 역 | 위키북스 | 2021년 11월 26일144 페이지로 편히 읽기 좋은 책예전에 도서관에서 이 책을 빌렸는데 막상 읽으려니 눈에 안들어와서 미뤘다가 이번에 다시 빌려서 읽고 있다.목차를 보면 각 장마다 유지보수 가능한 소프트웨어를 만드는 데 어떻게 도우밍 될까?라는 절이 있다. 어떤 부분이 더 개선이 되었는가를 설명해줘서 맥락을 따라가는데 도움이 될 것 같다.1. 계층형 아키텍처의 문제는 무엇일까?개발을 하면서 가장 익숙하고 많이 사용하는 아키텍처가 계층형 아키텍처(Layered Architecture)같다. 특히 스프링으로 개발할 땐 @Controller, @Service, @Repository를 사용하면 자연스럽게 계층형 아키텍처를 만들게 되는 느낌이다.웹 계층의 요청을 받아..
[JPA] Batch Insert
·
Spring Framework/JPA
대량의 데이터를 데이터베이스에 삽입하는 작업은 자주 접할 수 있는 이슈Spring Boot, PostgreSQL을 사용할 때 대량 데이터 삽입 성능을 최적화하는 방법과 실험을 통해 비교 분석JDBC Template을 직접 사용한 배치 삽입이 JPA Repository 방식보다 최대 76.3% 더 빠른 성능을 보였다.PostgreSQL의 `reWriteBatchedInserts` 옵션 활성화만으로도 상당한 성능 향상을 얻을 수 있었다.실습Spring Boot, Spring Data JPA, PostgreSQL 환경에서 대량 데이터를 삽입할 때 사용할 수 있는 여러 방법의 성능을 비교개별 엔티티 저장(Repository.save())엔티티 컬렉션 저장(Repository.saveAll())JDBC 템플릿을 ..
[Java] 동등성, 동일성
·
Language/Java
자바에서 객체를 비교할 때 혼동되기 쉬운 두 가지 개념 : 동등성(Equality)과 동일성(Identity)동등성(Equality)동등성은 두 객체가 논리적으로 동일한 값을 가지고 있는지를 비교primitive type : 값 자체를 비교reference type : 객체의 내부 상태(속성 값)를 비교동일성(Identity)동일성은 두 참조 변수가 메모리 상에서 정확히 같은 객체를 가리키는지를 비교두 변수가 힙 메모리에서 동일한 주소를 참조하는지를 비교하는 것equals()와 == 연산자== 연산자primitive type에 사용: 값 자체를 비교(동등성)reference type에 사용: 두 참조 변수가 같은 메모리 주소를 가리키는지 비교(동일성)@Testvoid comparePrimitive() {..
[Java] Enum 비교를 equals() 로 하지않고 == 로 해야 하는 이유
·
Language/Java
Java에서 Enum(열거형)은 관련된 상수들의 집합을 정의하는 특별한 데이터 타입이다. 타입 안전성을 보장하며, 코드의 가독성을 높여주는 장점이 있다.void foo1(String direction) { // direction에는 무슨 값이 들어갈지 모른다. if (direction == "????") { // ... }}// 열거형을 정의하면,enum Direction { NORTH, SOUTH, EAST, WEST}void foo1(Direction direction) { // 어떤 값이 올지 예측할 수 있다.}위의 예시처럼 Enum을 사용할 때 가장 기본적인 연산 중 하나는 두 Enum간 비교하는 것이다. 자바에서는 비교를 위한 equals() 메서드와 ==..