백엔드/Java

·백엔드/Java
이번 게시글에선 동시성 요청에 대한 이슈처리를 하기 위한 방법으로 '락'(lock) 에 대해서 알아보겠습니다.일반적으로 '락'을 분류할 때 큰 범주로 비관적 락과 낙관적 락으로 분류합니다.각각의 락에 대해 정리해보겠습니다.  비관적 락비관적 락은 충돌이 잦은 환경에서 주로 사용하는 락이라는 관점에서 '비관적'이라는 명칭이 붙었습니다.공유 자원에 락을 걸고 진행비관적 락은 데이터베이스 환경에서의 락입니다.비관적 락은 충돌이 발생할 것을 예상하고 작업을 진행하기 때문에시작부터 데이터베이스의 '공유락', '배타락'을 사용하여 작업을 순차진행 시킵니다. 공유락과 배타락에 대해선 저번 게시글에서 정리해보았었습니다.비관적 락은 공유락과 배타락은 락을 걸고 진행하기 때문에성능 오버헤드 이슈가 있고  또한 데드락의 위..
·백엔드/Java
안녕하세요!! 이번 게시물은 저번 시간에 이어서 동시성 이슈처리를 위한 방안에 대해 알아보려고 합니다.   이번엔 트랜잭션 격리수준에 대해 중점적으로 알아보려고 하는데요,,동시성 이슈는 결국 여러 트랜잭션이 동시에 작업을 처리하게 되면서 생기는 문제이기 때문에트랜잭션 격리수준을 다르게 가져가면 해결해볼 수 있지 않을까? 라는 아이디어가 떠올랐습니다.  그럼 먼저 4가지 트랜잭션 격리수준에 대해 알아보겠습니다.일관성(Consistency)이 높은 순서대로 설명드리겠습니다.   1. SERIALIZABLE (직렬화 가능한)설명: 데이터에 접근할 때 기본적으로 s-lock을 획득한다. 쓰기 작업을 위해 x-lock을 획득해야 하므로 특정 데이터에 대해 조회 중인 다른 트랜잭션이 존재하면 쓰기 작업이 불가능하다..
·백엔드/Java
안녕하십니까! 이번엔 저번 포스팅에 이어서 동시성 요청을 테스트하고 처리하는 방법에 대해 알아보겠습니다. 일단 원하는 테스트 방식에 대해 정리를 먼저 해볼까요? 저는 많은 수의 요청을 동시에 수용할 수 있는 프로그램을 만들고 싶습니다. 그러기 위해서 많은 수의 요청을 동시에 보내는 테스트 코드를 작성해야합니다. 위의 그림처럼 테스트 코드 구조를 정리해볼 수 있습니다. 많은 수의 N번 요청을 보낼 수 있어야 하고, 해당 요청들을 동시에 받은 후 처리해야합니다. 저번시간에 알아봤던 스레드풀 프레임워크를 활용해서 빠르게 테스트를 작성해볼까요? @Test void 스레드풀_사용한_동시요청() throws InterruptedException { int n = 2000; ExecutorService executo..
·백엔드/Java
- 글의 순서 - 동시성 처리 이슈 상황 - 자바 동시성 처리 기초 정보 및 동시성 처리 테스트 코드 작성 방안 - java.lang.Thread & java.lang.Runnable - ExecutorFramework - Thread VS ExecutorFramework - CountDownLatch - 처리방안 - 트랜잭션 격리수준 - Uncommitted Read - Committed Read - Repeatable Read - Serializable - 데이터베이스 수준에서의 처리 방안 - 락 - 비관적 락 - 락관적 락 - 어플리케이션 수준에서의 처리 방안 - 왜 어플리케이션에서 처리할 수 있어야 하는가? - syncronized - ConcurrentHashMap - 레디스 - 분산락 - 스핀..
·백엔드/Java
안녕하세요. 린내입니다~! 저번 게시글에선 주로 인터페이스와 추상클래스에 대해 알아보았습니다. 이번 게시글은 정적 클래스에 대해서 중점적으로 알아볼까요? 사실 자바에서는 정적 클래스가 따로 존재하진 않습니다. 자바에서 이너(혹은 중첩) 클래스가 아닌 일반 클래스는 static 키워드가 허용되지 않기 때문입니다. 통상적으로 정적 멤버(정적 필드, 정적 메소드)만 갖고 있는 클래스를 정적 클래스로 지칭하고 있습니다. // static class StaticExample { 일반 클래스에 static 키워드 사용 불가 class StaticExample { // 정적 멤버만 선언 } 정적 클래스의 멤버는 클래스 초기화 시 메서드 영역(클래스 영역)에 저장되어 프로그램이 종료될 때까지 유지됩니다. 따라서 프로그..
·백엔드/Java
안녕하세요. 린내입니다~! 오늘은 추상클래스에 대해 알아보려고 합니다. 추상클래스는 그 명칭에서 느껴지듯이.. 실무에서도 상당히 추상적으로 사용되는 느낌이 강한듯한데요. 알듯 말듯한 추상클래스에 대해서 이번 기회에 제대로 정리해보겠습니다. 하지만 사실, 오늘의 주인공은 추상클래스가 아닐수도 있습니다. 이 글의 발단은 아래의 게시글에서 시작되었는데요. 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..
·백엔드/Java
이전 시간에는 서비스 로직에서 하드코딩된 부분을 Enum 클래스로 대체하여 코드 로직을 통해 도메인을 파악할 수 있었고, 중복된 코드를 제거할 수 있었습니다. 하지만 Enum 클래스의 공통화까진 진행하지 못하여, 각 Enum 클래스에서 각각의 메소드를 선언해줘야 했습니다. 이번 시간에는 인터페이스를 사용하여 Enum 클래스를 공통화 해볼까요? 그러기 위해서, 알아두면 좋은 Java 개념을 한 번 확인해보고 가봅시다. 1. 타입 파라미터 2. abstact class Enum - 타입 파라미터는 형태로 클래스, 인터페이스 또는 메소드 내에서 사용할 수 있고, 특정 유형의 객체를 다룰 수 있게 해줍니다. - 또한 자바의 모든 Enum 타입은 내부적으로 위의 추상 클래스 java.lang.Enum 을 상속받고..
·백엔드/Java
https://github.com/nyoongoon/practical-enum-app 안녕하세요~ 고린내(goal-in-next)입니다. 이전 게시물에선 자체로 의미를 가진 경우에 대하여 간단한 Enum 클래스를 적용해보았습니다. 이번에 리팩토링할 대상은, 값 자체로는 특정한 도메인 의미를 갖지 않는 코드값들에 대한 처리입니다. 일단 작성한 Enum 클래스들을 확인해볼까요? @Getter @AllArgsConstructor public enum CategoryCode { CUSTOMER_INQUIRY("CT000001"), FREE_BOARD("CT000002"), REFUND_INQUIRY("CT000003"), //... private String code; } 위의 Enum클래스를 보시면, 상수명과..
·백엔드/Java
https://github.com/nyoongoon/practical-enum-app "군자이행언 소인이설언" 무릇 군자란 행동으로 말한다고 하였습니다.. 이넘을 일단 만들어 볼까요? public enum DeleteType { Y, N } @Getter @AllArgsConstructor public enum SomeCode { SOME("12341234"), THING("43214321"); private String code; } @Getter @AllArgsConstructor public enum CategoryCode { CUSTOMER_INQUIRY("CT000001"), FREE_BOARD("CT000002"), REFUND_INQUIRY("CT000003"), TECH_SUPPORT("C..
·백엔드/Java
https://github.com/nyoongoon/practical-enum-app 안녕하세요~ 고린내(goal-in-next)입니다. 이번 시간에는 레거시 코드들을 Enum Class을 사용하여 리팩토링 하는 시간을 가져볼까 합니다. (그런데, Enum을 Class라고 봐도 될까요?) 기존을 하드코딩되어 배드 스멜 코드들을 Enum을 사용하여 클-린하게 바꿔볼 것인데요, 크게 두 부분을 봐볼까 합니다. 1. 로직단에서의 Enum 활용 (일치, 포함 분기 공통화) 2. JPA 엔티티에서의 활용 (@Converter 사용) 우선, 이번 게시물에서는 레거시 코드를 보면서 문제점이 되는 부분들을 찾아볼게요. (아래 엔티티는 더 복잡한 상황을 가정하기 위해 복합키로 구성해보았습니다) @Entity @Table..
꾸준함의 미더덕
'백엔드/Java' 카테고리의 글 목록