본문 바로가기

반응형

전체 글

(35)
락을 활용한 동시성 처리 개요쇼핑몰 프로젝트 개발 중, Database 락을 활용하여 동시성 처리를 해결한 사례에 대해 소개하고자 합니다.재고 감소 로직 동시성 처리하기첫번째로 소개할 사례는 비관적 락을 활용하여 재고 감소에 대한 동시성 처리를 한 로직입니다. 코드는 다음과 같습니다.private int decreaseProductStock(List productDtoList) throws CannotFindEntityException, InvalidStockQuantityException { int totalPrice = 0; for(OrderDto.OrderProductRequestInfo productOrderInfo : productDtoList){ Product product = productRe..
MySQL에서 문자열 다루기 개요MySQL에서 문자열을 다루는 방법으로는 여러가지가 존재합니다. 먼저 컬럼을 정의할 수 있는 데이터 타입으로 CHAR, VARCHAR, TEXT 등이 있고, Collation을 통해 문자열 정렬이나 비교 연산이 달라질 수 있습니다. 이번에는 MySQL에서 문자열을 어떻게 다룰 수 있는지 알아보겠습니다.목차CHAR과 VARCHAR, TEXT란?CHAR과 VARCHAR 뒤에 붙는 숫자의 의미Collation이란?CHAR과 VARCHAR, TEXT란?앞서 언급했듯 컬럼을 정의하는 데이터 타입으로 CHAR, VARCHAR, TEXT가 있습니다. 이 3가지 타입을 비교해보겠습니다.CHAR고정형의 크기를 가지며, 추가적인 연산이 필요하지 않아 검색 속도 및 읽히는 속도가 VARCHAR에 비해 빠릅니다.최대 25..
캐시 전략 정리 캐시의 읽기 전략Look-Aside : 먼저 캐시에 데이터 조회 -> 없으면 DB에서 조회후 캐시 저장하는 방식입니다.장점 : 캐시에 장애가 발생해도 DB에서 데이터를 읽어올 수 있으므로 전체에 치명적인 영향을 주지 않습니다.단점 : 동시에 여러 요청이 같은 키에 대해 캐시 미스가 발생할 경우, 데이터베이스에 중복 쿼리가 발생할 수 있습니다.Read-Through: 캐시에 데이터 조회, 없으면 DB에서 조회해와서 캐시에 저장 -> 캐시의 값을 반환하는 방식입니다.장점: 어플리케이션이 캐시에만 값을 참조하므로 어플리케이션의 일관성이 존재합니다.단점: 어플리케이션이 무조건 캐시 서버에서 데이터를 조회하므로 캐시서버가 다운되면 문제가 될 수 있습니다.요약 : 캐시 미스시 어플리케이션이 DB에 접근하면 Look..
N + 1 쿼리 개선하고 확장성 있는 코드 만들기 개요Flab 프로젝트를 진행하던 중, 공연 상세 조회 API에서 N+1문제가 발생함을 알아차렸습니다.관련한 요구사항을 간단히 설명하자면, 먼저 공연에는 "공연 날짜" 엔티티가 1:N으로 연관을 맺고 있습니다. 각 공연 날짜에서 예매한 좌석의 수를 확인하기 위해 각 공연날짜마다 예약의 갯수를 조회해야 하는 로직이 필요했습니다.이해를 돕기 위해 Performance 상세 조회를 하기 위해 필요한 엔티티들의 관계를 도식화하면 아래와 유사한 형식이 나옵니다.관련 코드이와 관련한 코드는 아래와 같습니다.fun searchDetail(uid : String) : PerformanceDetailResponse{ val performance = performanceRepository.findByUid(uid) ..
테스트 코드 개선하기 개요Flab 티케팅 프로젝트를 진행하며 받았던 테스트 코드에 대한 피드백과 개선사항을 정리하고자 합니다.티케팅 프로젝트에서 테스트시 사용하는 프레임워크와 라이브러리는 아래와 같습니다.KotlinKotest(+ kotest-extensions-spring)mockk개선 전 UnitTest저는 모든 TestCode를 BDD형식으로 작성하고 개발하고 있었습니다. 아래는 이에 대한 예시코드로, UserService의 회원가입 로직을 검증하는 테스트입니다.given("이메일 인증 코드 검증이 완료된 사용자의 경우") { val email = "email@email.com" every { emailVerifier.checkVerified(email) } returns Unit..
Java의 시간 클래스들 개요JAVA의 발전에 따라 사용하는 JAVA의 시간 클래스를 다루어보고 각 클래스들의 차이점과 주의 사항에 대해 알아보고자 합니다.JAVA의 발전에 따른 JAVA 라이브러리의 변경초기 Java에서는 Date와 Calander를 사용하여 시간을 표현하였습니다. 그러나 이 라이브러리들은 TimeZone을 표현하기 불편하다거나, 클래스의 인터페이스가 불편한 문제점이 있었습니다. 그리고 가장 큰 문제는 가변 객체이기 때문에 다양한 환경에서 하나의 객체를 나타낼 때 안전성을 보장하지 못했습니다.그래서 이를 개선해서 나온게 joda의 Joda-Time 라이브러리로, 위 초기 Java 라이브러리에서 발생한 문제를 모두 해결한 라이브러리였습니다.Java 1.8 버젼에서 Joda-Time 라이브러리와 유사한 java.t..
War와 Jar 개요Spring 또는 Java로 웹 어플리케이션을 만들게 되면 .war 파일과 .jar 이 생성됩니다. 이번에는 이 파일들에 대해 알아보고자 합니다.Jar 파일jar 파일은 java archive의 약자로, JVM위에서 실행되거나 라이브러리로 사용할 수 있도록 관련 된 자바 클래스 파일을 압축한 파일입니다.실행하는 경우 main() 메서드가 필요하며, MANIFEST.MF에 메인 메서드의 클래스를 지정해 주어야 합니다.jar 파일을 압축 해제 했을때 포함하는 파일은 다음과 같습니다.META-INFMANIFEST.MF : jar 파일을 시작할 때 실행되는 main 메서드와 기타 메타 정보를 포함한 파일classes : 사용자가 작성한 Java 코드(ByteCode의 형태)jar 파일은 기본적으로 Jar파일..
Spring과 Spring Boot의 차이점 스프링이란?💡 Spring은 자바 프로그래밍을 모든 사람들에게 더 빠르고, 더 쉽고, 더 안전하게 만들어줍니다. Spring은 속도, 단순성, 그리고 생산성에 집중한 자바를 세계에서 가장 인기 있는 프레임워크로 만들었습니다.스프링은 여러 프로젝트를 포함한 프레임워크로, 객체지향 어플리케이션을 개발할 수 있도록 도와주는 프레임 워크입니다.스프링은 DI와 DI Container, AOP, Web MVC등을 지원해 객체지향적인 어플리케이션을 개발하도록 도와줍니다.DI란?DI는 Dependency Injection의 약자로, 특정 객체의 생명주기를 관리하고 의존성을 주입시켜주는 역할을 합니다.Spring에서는 이러한 DI를 소스코드가 아닌 외부 파일(.xml 등)을 통해 정의해주어야 했습니다.Spring의 문..

반응형