이번 게시글에선 동시성 요청에 대한 이슈처리를 하기 위한 방법으로 '락'(lock) 에 대해서 알아보겠습니다.일반적으로 '락'을 분류할 때 큰 범주로 비관적 락과 낙관적 락으로 분류합니다.각각의 락에 대해 정리해보겠습니다. 비관적 락비관적 락은 충돌이 잦은 환경에서 주로 사용하는 락이라는 관점에서 '비관적'이라는 명칭이 붙었습니다.공유 자원에 락을 걸고 진행비관적 락은 데이터베이스 환경에서의 락입니다.비관적 락은 충돌이 발생할 것을 예상하고 작업을 진행하기 때문에시작부터 데이터베이스의 '공유락', '배타락'을 사용하여 작업을 순차진행 시킵니다. 공유락과 배타락에 대해선 저번 게시글에서 정리해보았었습니다.비관적 락은 공유락과 배타락은 락을 걸고 진행하기 때문에성능 오버헤드 이슈가 있고 또한 데드락의 위..
안녕하세요!! 이번 게시물은 저번 시간에 이어서 동시성 이슈처리를 위한 방안에 대해 알아보려고 합니다. 이번엔 트랜잭션 격리수준에 대해 중점적으로 알아보려고 하는데요,,동시성 이슈는 결국 여러 트랜잭션이 동시에 작업을 처리하게 되면서 생기는 문제이기 때문에트랜잭션 격리수준을 다르게 가져가면 해결해볼 수 있지 않을까? 라는 아이디어가 떠올랐습니다. 그럼 먼저 4가지 트랜잭션 격리수준에 대해 알아보겠습니다.일관성(Consistency)이 높은 순서대로 설명드리겠습니다. 1. SERIALIZABLE (직렬화 가능한)설명: 데이터에 접근할 때 기본적으로 s-lock을 획득한다. 쓰기 작업을 위해 x-lock을 획득해야 하므로 특정 데이터에 대해 조회 중인 다른 트랜잭션이 존재하면 쓰기 작업이 불가능하다..
안녕하십니까! 이번엔 저번 포스팅에 이어서 동시성 요청을 테스트하고 처리하는 방법에 대해 알아보겠습니다. 일단 원하는 테스트 방식에 대해 정리를 먼저 해볼까요?저는 많은 수의 요청을 동시에 수용할 수 있는 프로그램을 만들고 싶습니다.그러기 위해서 많은 수의 요청을 동시에 보내는 테스트 코드를 작성해야합니다. 위의 그림처럼 테스트 코드 구조를 정리해볼 수 있습니다. 많은 수의 N번 요청을 보낼 수 있어야 하고, 해당 요청들을 동시에 받은 후 처리해야합니다.저번시간에 알아봤던 스레드풀 프레임워크를 활용해서 빠르게 테스트를 작성해볼까요? @Testvoid 스레드풀_사용한_동시요청() throws InterruptedException { int n = 2000; ExecutorService ex..
- 글의 순서 - 동시성 처리 이슈 상황 - 자바 동시성 처리 기초 정보 및 동시성 처리 테스트 코드 작성 방안 - java.lang.Thread & java.lang.Runnable - ExecutorFramework - Thread VS ExecutorFramework - CountDownLatch - 처리방안 - 트랜잭션 격리수준 - Uncommitted Read - Committed Read - Repeatable Read - Serializable - 데이터베이스 수준에서의 처리 방안 - 락 - 비관적 락 - 락관적 락 - 어플리케이션 수준에서의 처리 방안 - 왜 어플리케이션에서 처리할 수 있어야 하는가? - syncronized ..
안녕하세요. 린내입니다~! 저번 게시글에선 주로 인터페이스와 추상클래스에 대해 알아보았습니다. 이번 게시글은 정적 클래스에 대해서 중점적으로 알아볼까요? 사실 자바에서는 정적 클래스가 따로 존재하진 않습니다. 자바에서 이너(혹은 중첩) 클래스가 아닌 일반 클래스는 static 키워드가 허용되지 않기 때문입니다. 통상적으로 정적 멤버(정적 필드, 정적 메소드)만 갖고 있는 클래스를 정적 클래스로 지칭하고 있습니다. // static class StaticExample { 일반 클래스에 static 키워드 사용 불가 class StaticExample { // 정적 멤버만 선언 } 정적 클래스의 멤버는 클래스 초기화 시 메서드 영역(클래스 영역)에 저장되어 프로그램이 종료될 때까지 유지됩니다. 따라서 프로그..
안녕하세요. 린내입니다~! 오늘은 추상클래스에 대해 알아보려고 합니다. 추상클래스는 그 명칭에서 느껴지듯이.. 실무에서도 상당히 추상적으로 사용되는 느낌이 강한듯한데요. 알듯 말듯한 추상클래스에 대해서 이번 기회에 제대로 정리해보겠습니다. 하지만 사실, 오늘의 주인공은 추상클래스가 아닐수도 있습니다. 이 글의 발단은 아래의 게시글에서 시작되었는데요. https://stackoverflow.com/questions/3340032/are-utility-classes-evil Are utility classes evil? I saw this question: If a "Utilities" class is evil, where do I put my generic code? And I thought, why ar..
저번 게시글에서 DB 저장 시 원하는 코드 값이 아닌 숫자값이 그대로 DB에 저장되고 있는 이슈를 확인해보았습니다.이번엔 Enum을 활용하여 개발자의 의도대로 데이터를 insert하는 방법을 알아보겠습니다. 1. 의도대로 Insert 되지 않고 있는 필드들.. - @Id, @Enumerated @Entity@Table(name = "post")@Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)@IdClass(PostId.class)public class Post { @Id @Enumerated(EnumType.STRING) // 왜 적용 조차 안되지.. @Column(name = "category_code") private ..
안녕하세요~ 꾸준함의 미더덕입니다. 이전 게시물에선 Enum의 field name 자체로 의미를 가진 경우에 대하여 간단한 Enum 클래스를 적용해보았습니다. 이번에 리팩토링할 대상은, 값 자체로는 특정한 도메인 의미를 갖지 않는 코드값들에 대한 처리입니다. 일단 작성한 Enum 클래스들을 확인해볼까요? 상황) 상수명과 코드값이 일치하지 않음 @Getter@AllArgsConstructorpublic enum CategoryCode { CUSTOMER_INQUIRY("CT000001"), FREE_BOARD("CT000002"), REFUND_INQUIRY("CT000003"), //... private String code;} 위의 Enum클래스를 보시면, 상수명과 코드값이..
안녕하세요~ 꾸준함의 미더덕입니다. 이번 시간에는 레거시 코드들을 Enum Class을 사용하여 리팩토링 하는 시간을 가져볼까 합니다. (그런데, Enum을 Class라고 봐도 될까요? -> 맞습니다.. Enum은 추상클래스입니다..!) 기존을 하드코딩되어 배드 스멜 코드들을 Enum을 사용하여 클린하게 바꿔볼 것인데요.크게 두 부분을 봐볼까 합니다. 1. 비즈니스 로직상에서 Enum 활용 2. JPA 엔티티에서의 활용(@Converter 사용) 레거시 코드 예시 우선, 이번 게시물에서는 레거시 코드를 보면서 문제점이 되는 부분들을 찾아보겠습니다.(상황의 복잡성을 더하기 위해 복합키 설정까지 해보았습니다.) cf) 복합키 상황에서 GeneratedValue는 사용할 수 없습니다.복합 키를 갖고 ..