일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- jpa
- MySQL
- CAS
- 자바
- 데이터 타입
- db
- Synchronized
- 스프링
- Locking Read
- gc
- 백엔드
- java
- 가비지 컬렉터
- iterable
- Di
- iterator
- Varchar
- 가비지 컬렉션
- foreach
- reflection
- Lock
- Atomic Type
- 동시성
- text
- MVCC
- 동시성 문제
- Today
- Total
목록분류 전체보기 (95)
과정을 즐기자
이번 글에서는 RDBMS의 MVCC가 팬텀 리드를 막을 수 있는지 알아보겠습니다.먼저 MVCC, 팬텀 리드에 대한 용어부터 정리해보겠습니다. MVCC는 Multi Version Concurrency Control의 약자로 레코드 값을 여러 버전으로 관리한다는 것을 의미합니다.MVCC를 사용함으로써 잠금 없는 읽기를 제공하면서 여러 트랜잭션의 동시 처리 성능을 높였습니다. 팬텀 리드는 같은 트랜잭션 내부에서 같은 쿼리를 실행했을 때 새로운 레코드가 보일 수 있는 경우를 말합니다.같은 레코드의 데이터 자체는 바뀌지 않지만 새로운 데이터가 추가되거나 삭제된 경우는 쿼리의 결과값이 동일하게나오지 않을 수 있습니다.📕 예제 만들어보기여기서 한가지 의문점이 들었습니다. DB 격리 레벨에서 Serializable을..
여러 서비스를 이용하다보면 다음과 같은 필터링 기능을 볼 수 있습니다. 수많은 강의들이 있는데 Spring, MySQL, Node.js, React, SQL과 같은 키워드를 바탕으로 해당되는 강의들을 필터링해서보여주는 기능입니다. 또 이러한 기술 검색 필터링 외에도 검색 키워드를 바탕으로 해당 키워드를 제목으로 포함한 강의를 보여주는 기능도 있을 수 있습니다. 검색 기능 구현을 위해서는 3가지 방법 정도가 생각납니다. 1. RDBMS의 like 키워드 사용2. RDBMS의 Fulltext index 사용3. Elasticsearch와 같은 검색 엔진 사용 기술적인 내용은 위와 같지만 이번 글에서는 이러한 기술은 조금 제쳐두고 조금 더 원리에 집중해서 어떻게 기능을 구현하면 좋을지 생각해보겠습니다.📕 역..
Java 21 LTS 버전부터 정식으로 Virtual Thread가 포함되었습니다.Virtual Thread 란 무엇일까요? 오라클 공식 문서에 있는 표현은 다음과 같습니다."Virtual threads are lightweight threads that reduce the effort of writing, maintaining, and debugging high-throughput concurrent applications." 간단하게 해석해보면 처리량이 높은 애플리케이션을 만들 때 유지 관리 및 디버깅의 노력을 줄여주는 경량 쓰레드입니다.경량 쓰레드라는 말을 처음 보았을 때 CPU 코어를 더 잘 활용하기 위해 쓰레드 개념이 나온 것처럼 경량 쓰레드가 나온 이유도뭔가 비슷한 이유가 아닐까 라는 생각만 ..
싱글톤이란 클래스의 인스턴스를 하나만 생성하는 것을 말합니다. 스프링 컨테이너가 관리하는 스프링 빈들은 기본적으로 싱글톤으로 관리됩니다. 이번 글에서는 스프링에서 객체를 싱글톤으로 등록하는 방법, 싱글톤으로 관리하는 이유, 싱글톤 사용시 주의할 점,싱글톤을 직접 만드는 것의 단점과 스프링이 관리해주는 이유에 대해 알아보겠습니다. 📕 싱글톤으로 등록하는 방법스프링 프레임워크를 사용하다보면 크게 2가지 방법으로 스프링 빈을 등록합니다.등록하는 방법부터 간단하게 살펴 보겠습니다. 1. @Component 어노테이션 기반@Component, @Controller, @Service, @Repository와 같은 어노테이션으로 등록하고 가장 많이 사용하는 방법입니다. @Component의 메타 어노테이션 중에서 ..
이번 글에서는 개발바닥 유튜브 채널에 있는 개발바닥 장학 라이브 퀴즈를 같이 보고 정리해보려고 합니다.꽤 오래전에 본 영상인데 최근에 다시 보다가 재밌는 이야기가 많아 글로 써보려고 합니다. 📕 창의력 쑥쑥 문제 1 👍 서버 제한 풀기앱에서 서버로 이미지를 전달하는데 5MB를 초과할 때 문제가 발생합니다.뭐 간단하게... 서버 5MB 제한을 풀면 될 거 같지만 문제의 조건에는 맞지 않습니다.그래도 생각해보자면 Spring Boot를 사용할 때 application-yml, application-properties 와 같은 설정을 수정할 수 있습니다.spring: servlet: multipart: max-file-size: 100MB max-request-size: 100M..
이번 글에서는 if, else if 가 점점 많아져 가독성이 좋지 않은 코드를 개선해보는 작업을 해보겠습니다.먼저 요구 사항부터 살펴보겠습니다. 1. 간단한 결제 로직을 구현한다.2. 현재 네이버 페이, 카카오 페이, 토스 페이, 애플 페이를 지원한다. 인터페이스를 활용하여 결제 로직을 구현해보겠습니다.📕 PaymentProviderPaymentProvider는 페이 종류를 나열하였습니다.📕 PaymentChannelPaymentChannel 인터페이스는 해당 페이의 종류인지 확인하는 isSupport() 메소드와 결제를 처리하는 processPayment()메소드가 있습니다. PaymentChannel 인터페이스의 구현체로 NaverPayChannel, KakaoPayChannel, TossPayC..
이번 글에서는 시간, 랜덤 값과 같은 제어할 수 없는 영역을 테스트하는 방법에 대해 작성해보겠습니다.예시로 날짜에 따라 할인을 적용하는 간단한 로직을 만들어보았습니다. Bad - 의존성이 내부에 숨겨져 있음위 코드는 2024년 6월 30일 이전 날짜인 경우에만 2000원의 할인이 적용됩니다.잘 작성한 것 같아보이지만 문제점이 보이시나요? Bad - 테스트하기 어려움 할인 날짜보다 이전/이후 날짜에 따라 할인 적용 여부가 결정되는데 시간의 흐름에 따라 테스트 코드가 달라질 수 있습니다.제어할 수 없는 영역인 시간에 대한 정보가 메소드 내부에 숨겨져 있기 때문입니다.즉, 해당 코드는 테스트 코드를 작성하기가 어렵습니다. 📕 제어할 수 없는 영역은 밖으로 밀어내자이제 이 메소드를 리팩토링하여 테스트할 수 있..
이번 글에서는 프로젝트를 진행하면서 복잡한 비즈니스 로직을 풀어냈던 방법에 대해 작성해보려고 합니다.⛳️ 요구 사항먼저 요구사항에 대해 정리해보겠습니다. 1. 각각의 회원이 각자의 캘린더를 가지고 있음2. 회원은 여러 모임에 참여할 수 있음3. 모임장은 참여한 회원들의 캘린더 정보를 바탕으로 팀원들의 가용시간을 확인할 수 있음4. 이 가용시간을 바탕으로 특정 시간에 미팅을 생성할 수 있음 위와 같은 요구 사항이 있습니다. 이번 글에서는 3번에 대한 요구 사항을 중점적으로 이야기를 해볼텐데 대략 아래와 같은 UI를제공합니다. 각 회원의 캘린더 정보를 가져와서 하나의 캘린더에 색상으로 표현을 합니다.색상이 진할 수록 가능한 사람이 많은 시간대를 의미하며 해당 캘린더를 클릭하면 가능한 회원의 정보를 볼 수 있..
이번 글에서는 프로젝트를 진행하면서 저희 팀이 어떻게 테스트 코드를 작성하고 있는 지에 대해 이야기 해보려고 합니다.저희 팀은 현재 백엔드 개발자가 3명입니다. 테스트 코드를 작성하는 규칙을 정할 때 많은 이야기가 오고 갔습니다.주로 이야기 했던 것은 테스트 코드가 중요하다고 관성적으로 작성하지 말고 "왜" 필요한지를 꼭 인지하며테스트 코드 작성이 서비스 개발에 큰 도움이 되는 것을 느껴보자는 것이었습니다. 테스트 코드가 중요하다는 사실은 수도 없이 들었지만 이전에 해왔던 방식에서 크게 2가지 문제점을 느꼈습니다. 1. 관성적으로 의미 없는 테스트 코드를 작성하지는 않았는가?2. 실질적인 이득을 본 것이 무엇인가? 이러한 문제를 인식하고 안정적이고 견고한 서비스를 개발하기 위해 테스트 코드를 작성하는 규..
프로젝트를 진행하면서 사용자가 시간표를 등록하면 해당 시간표 정보를 서비스의 캘린더에 반영하는 기능을 구현하였습니다.이때 1명의 사용자만 한 학기의 시간표를 등록해도 한 번에 200, 300개의 insert 쿼리가 날라갔습니다.만약 1000명의 사용자가 동시에 등록을 하게되면 20, 30만건의 insert 쿼리가 한 번에 날라가게 된 것입니다.📕 Spring Data JPA의 save() 메소드기존에 Spring Data JPA를 사용하여 단순히 save 메소드를 호출하였는데 서비스가 점점 커질수록 이러한 방식은문제점을 가지고 있던 것입니다. 먼저 기존의 코드를 살펴보겠습니다. 저장할 스케줄을 List로 받아서 하나 하나 save 메소드를 호출해주었습니다. @Transactional public voi..