전체 글 75

Utility 클래스의 장단점

Utility 클래스 클래스 인스턴스를 생성하지 않고도 기존 코드 블록을 재사용할 수 있는 범용 클래스 static 클래스고 Stateless로 사용하여 멀티스레드 환경에서 Thread-safe하다. 보통 final로 선언되어 상속될 수 없고, 생성자는 private으로 선언되어 초기화 가능성을 막아버리며 다른 클래스에 의해 생성될 수 없다. Utility 클래스의 장점 여러 클래스에서 공통적으로 사용되는 메서드를 모아서 관리하며 코드의 재사용성을 높인다. Utility 클래스의 단점 1. Utility Class는 근본적으로 객체지향적인 프로그래밍 기법이 아니다. Utility Class는 기능 분할에 익숙해져있는 절차적 프로그래밍에 가깝다. 2. Utility Class를 사용하는 클래스는 Utili..

Java ☕ 2024.03.23

[Effective Java] 프로젝트에 적용하기

아이템 1 생성자 대신 정적 팩터리 메서드를 고려하라 클래스는 생성자와 별도로 그 클래스의 인스턴스를 반환하는 정적 메서드를 제공할 수 있다. 정적 팩터리 메서드가 생성자보다 좋은 점 1. 이름을 가질 수 있다. 2. 호출될 때마다 인스턴스를 새로 생성하지 않아도 된다. 3. 반환 타입의 하위 타입 객체를 리턴할 수 있다. 4. 입력 매개변수에 따라 다른 클래스의 객체를 반환할 수 있다. 5.정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다. ⬇️ 장점 추가 설명 더보기 1. 생성자 자체는 생성되는 객체의 특징을 직관적으로 설명하진 않는다. 반면 정적 팩터리는 이름만 잘 지으면 반환될 객체의 특성을 쉽게 묘사할 수 있다. 2. 인스턴스를 미리 만들어 놓거나 새로 생성한 ..

Java ☕ 2024.03.05

[Effective Java] 아이템 15 클래스와 멤버의 접근 권한을 최소화하라

아이템 15 클래스와 멤버의 접근 권한을 최소화하라 프로그램 요소의 접근성은 가능한 한 최소한으로 하라. 꼭 필요한 것만 골라 최소한의 public API를 설계하자. 그 외에는 클래스, 인터페이스, 멤버가 의도치 않게 API로 공개되는 일이 없도록 해야 한다. public 클래스는 상수용 public static final 필드 외에는 어떠한 public 필드도 가져서는 안 된다. public static final 필드가 참조하는 객체가 불변인지 확인하라. ⎮프로그램 요소의 접근성은 가능한 한 최소한으로 하라. 접근성을 최소화해야 하는 이유는 정보 은닉의 장점 때문이다. [정보 은닉의 효과] 1. 시스템 개발 속도 향상 : 서로의 구현을 몰라도 되기 때문에 병렬로 개발이 가능하여 개발 속도가 빨라진다..

Java ☕ 2024.03.03

JWT 인증∙인가 구현하기

JWT란 JWT(JSON Web Token)란? | JWT 구성요소 토큰이 필요한 이유와 JWT 동작 방식 인증, 인가 흐름(+클래스 다이어그램) JwtProvider 구현 JwtProvider는 Jwt를 생성, 파싱, 검증하는 클래스다. 구현엔 jjwt 라이브러리를 사용했다. jwt 관련 정보인 secret, expire-length를 application.yml에 다음과 같이 설정했다. jwt: header: Authorization secret: (특정 문자열을 Base64로 인코딩한 값) access-token: expire-length: 3600 refresh-token: expire-length: 86400private final Key key; @Value("${jwt.access-token..

Spring 🌱 2024.02.11

동시성 이슈 해결하기 : synchronized, MySQL Lock, Redis Lock

동시성 문제 하나의 데이터에 여러 스레드가 동시에 접근하면서 생기는 문제를 동시성 문제라고 한다. 하나의 세션이 데이터를 수정 중일때, 다른 세션에서 수정 전의 데이터를 조회해 로직을 처리함으로써 데이터의 정합성이 깨지게 된다. 동시성 문제 해결 방법 동시성 문제는 하나의 세션이 데이터를 사용하는 동안, 다른 세션은 데이터를 사용하지 못하게 함으로서 해결할 수 있다. 세션의 독립적인 실행을 구현하는 방법으로 다음 세 가지 방법이 있다. 1. Application 레벨에서 synchronized 사용 2. 데이터베이스의 Lock 사용 3. Redis의 Lock 사용 재고 감소 로직을 통해 동시성 문제를 살펴보고 해결해보자. 목차 0. 재고 시스템 기본 로직 1. 멀티 스레드 환경에서 동시성 문제가 발생하는..

Spring 🌱 2024.02.11

동시성 이슈 해결하기 : 비관적 락 테스트 코드에 @Transactional을 사용하면 Lock wait timeout exceeded가 발생하는 이유

결론부터 말하자면 @Transactional의 동작 방식 때문이다. 문제 상황 재고를 하나 감소시키는 요청이 동시에 100개가 들어온 상황이다. 비관적 락을 사용해서 Race condition을 피하려한다. 이때 테스트 코드에 @Transactional을 붙이면 Lock wait timeout exceeded가 발생하며 테스트에 실패한다. @SpringBootTest @Transactional class StockServiceTest { @Test public void 동시에_100개의_요청() throws InterruptedException { int threadCount = 100; ExecutorService executorService = Executors.newFixedThreadPool(32..

Spring 🌱 2023.12.16

동시성 이슈 해결하기 : synchronized와 saveAndFlush

synchronized - synchronized를 메소드에 명시해주면 하나의 스레드만 접근이 가능하다. - 멀티스레드 환경에서 스레드간 데이터 동기화를 위해 자바에서 제공하는 키워드다. - synchronized는 현재 데이터를 사용하고 있는 스레드를 제외하고 나머지 스레드들이 데이터에 접근할 수 없도록 막아 순차적으로 데이터에 접근할 수 있도록 한다. 본문 정원이 n명인 독서 모임이 있다. 현재 모임원은 n-1명으로, 한 명만 더 가입할 수 있다. 이때 두 명의 유저가 동시에 가입을 시도하면 둘 중 한 명만 가입이 되어야 한다. 가입 시, 모임 정원을 확인하여 남은 자리가 없다면 정원 초과 예외를 발생시킨다. 모임 가입 기능 전체 코드 - Club.java : 독서 모임 엔티티 - ClubServic..

Spring 🌱 2023.12.01

[Java] Arrays.sort()와 Collections.sort()의 시간복잡도 비교

배열을 정렬하는 Arrays.sort()와 컬렉션을 정렬하는 Collections.sort()는 각기 다른 알고리즘을 이용하여 정렬을 수행한다. 정렬에 따라 시간 초과 문제가 발생할 수도 있어 다음 내용을 숙지하고 있도록 한다. 정렬 방식 시간 복잡도 Arrays.sort() DualPivotQuicksort 평균 : O(nlog(n)) / 최악 : O(n^2) Collections.sort() TimeSort 평균, 최악 : O(nlog(n)) 최악의 경우에도 O(nlog(n))의 시간복잡도를 갖고 있는 Collections.sort()를 표준 정렬 알고리즘으로 채택하고 있다고 한다.

Java ☕ 2023.11.20