Java 19

[Java/Spring]선착순 티켓 예매의 동시성 문제: 잠금 없이 처리하기(Feat. 우테코 아티클)

Introduction 예제는 깃허브에 업로드해뒀습니다. 얼마 전, 우테코 블로그에 올라온 한 아티클이 화제였다. 바로 라는 제목의 글이었다. 사내 슬랙 채널에 리드님께서 해당 글을 공유해주셨더라. 그러면서 스레드에 아래와 같은 화두를 던지셨다. 아예 데이터(Ticket 엔티티)에 락을 안 걸고 만들 수 있는 방법은 어떤 게 있을까요? 여기서 전제는 "기존 환경 그대로에서"였다. 즉, 위에 다른 분께서 언급하신 것처럼 메시지큐를 사용한다거나 싱글 스레드 모델을 적용하는 등 아키텍쳐를 변경하지 않고도 바꿀 수 있는 지였다. 이에 많은 팀원들이 여러 가지 방법을 제안해주셨다. 흥미로운 이야기들이 많이 오고갔는데(사실상 거의 모든 동시성 해결 기술이 언급된듯), 결과적으로 리드님께서 원하는 방향은 테이블 구조..

Java 2023.10.10

[Java]함수형 프로그래밍: 익명 클래스보다는 람다를, 람다보다는 메소드 참조를 사용해라?(Feat. Open source contribute

TL;DR회사에서 쓰는 오픈소스 공부하다 리팩토링 욕구가 샘솟았다.리팩토링해서 PR 올렸는데 머지됐다.오늘부터 오픈소스 컨트리뷰터 ㅋBackground2주 전을 기점으로 Payment 파트에서 Loan 파트로 팀이 옮겨졌다. 지난 6개월 동안은 유저에게 비즈니스 가치를 전달하는 피쳐 위주 개발을 경험했다. 잘 이끌어주신 덕분에 좋은 성과 역시 낼 수 있었다. 그래서 이번에는 비즈니스의 코어 쪽으로 더 파고들 수 있는 Loan platform 팀으로 가보는 게 어떻겠냐는 제안을 받았다. 나 역시 예전부터 코어 쪽을 들여다보고 싶은 마음이 컸던 지라 기쁜 마음으로 흔쾌히 수락했다. 현재 우리 회사의 전체 아키텍쳐를 개략적으로 살펴보면 유저들이 사용하는 앱을 관장하는 Balance-API 서버와 그 뒷단에서 ..

Java 2023.07.28

@ParameterizedTest: 반복적인 테스트를 한 번에 돌릴 수는 없을까?

@ParameterizedTest: 반복적인 테스트를 한 번에 돌릴 수는 없을까?🤔 Introduction 버그 수정 관련 티켓을 발급받았다. 이메일 검증 로직 관련 버그였는데, 마이크로서비스 간에 서로 다른 이메일 validator를 써서 일어난 문제였다. 문제의 원인을 파악한 뒤, 동일한 validator를 쓰도록 변경하고 나서 테스트 코드를 작성했다. 그런데 테스트 코드마다 넣어줘야 할 이메일 값만 다를 뿐, 나머지는 전부 동일한 로직의 코드를 매번 작성하려니 여간 찜찜할 수가 없었다. 반복적인 테스트를 한 번에 돌릴 방법이 없을지 고민했다. 마침 코드 리뷰에서 @ParameterizedTest를 쓰는 게 어떻겠냐는 코멘트를 받았다. 이번 시간에는 @ParameterizedTest의 정체와 이를 사..

Java 2023.01.28

[Java] 자바에서 null과 빈 문자열("") 데이터의 크기는 얼마나 될까?

Introduction 같은 회사 동료분과 이야기 나누다가 한 가지 질문을 받았다. 자바에서는 빈 문자열과 null의 크기를 어떻게 정할까요? 어라. 한 번도 생각해보지 못했다. 빈 문자열이면 당연히 크기가 0이지 않나? 하겠지만 데이터의 크기가 0이면 애초에 표시 자체를 할 수 없으니 말이 되지 않다. 그 자체를 표현하기 위한 데이터의 크기가 분명 존재할 것인데, 자바 자체적으로 정해놓은 크기가 있을 것이다. 1. 빈 문자열의 크기는 얼마나 될까? 찾아보기 전에 직접 테스트를 돌려보자. String 객체를 생성하기 전후로 힙 메모리의 용량 변화를 출력하는 코드이다. (아래 코드는 해당 링크에서 가져왔다. 사이트에서 말하는 결과값은 예전 자바 버전이라 요즘과 결과가 다르니 코드만 참고할 것.) publi..

Java 2022.10.11

[Java]SimpleDateFormat을 쓰면 안된다고? (feat.Thread-Safe)

Introduction 현재 사내 툴에 들어갈 간단한 기능을 개발하는 작업을 받아 진행하는 중이다( 그 간단한 걸 3주나 하고 있다고… ). 클라이언트가 어떤 문서를 제출했을 때, 제출한 날짜를 어드민에서 수정할 수 있도록 하는 기능이다. 간단해보이지만 이걸 스프링에서 짜려니 레이어별로 책임을 분리하고 DTO를 만들고 등등 이것저것 할 게 많았다. 어찌어찌 개발을 끝내고 PR을 올렸더니.. 코멘트 61개 달린 거 실환가..그 와중에 이렇게 라인 바이 라인으로 디테일하게 피드백 받을 수 있어 엄청 행복했다. (코드리뷰에 진심인 우리 회사 오세요 여러분) 피드백 중에 SimpleDateFormat을 쓰지 말라는 코멘트를 받았다. 기존 코드에서는 서비스 레이어에서 받아온 String을 SimpleDateFor..

Java 2022.08.29

[Java]String pool: String에서도 캐싱 기능을 제공한다고?

Intro: String에서 객체 비교 예제를 하나 만들어보자. //case 1 String name1 = new String("BHK"); String name2 = new String("BHK); boolean result1 = name1.equals(name2) boolean result2 = name1 == name2 // 위에서 공부한 내용과 같이 결과는 다음과 같다. true // .equals() name1, name2 값만 비교 false // == name1, name2의 객체 주소를 비교 아래 예제는 어떨까? //case 2 String name1 = "BHK"; String name2 = "BHK"; System.out.println(name1 == name2); 결과는 참이다. tr..

Java 2022.06.22

[Java] == 연산자와 .equals()의 차이는?

==과 .equals()의 차이는? 저번 글에서 썼던 예제를 살짝 바꿔보자. public static void main(String[] args) { Integer a = 128; Integer b = 128; System.out.println(a == b); System.out.println(a.equals(b)); } 결과는 어떻게 나올까? false // == true // .equals() == 연산자야 둘을 비교하는 연산자인 건 워낙 많이 봤고, .equals() 메소드도 보면 두 객체를 비교하는 메소드인 것 같은데 무엇이 다르길래 하나는 false이고 하나는 true일까? 바로 무엇을 비교하느냐의 차이다. == 연산자는 객체 자체를 비교한다. 정확히는 비교하려는 두 객체 각각의 메모리 내 주소..

Java 2022.06.17

[Java] IntegerCache: Integer 객체에서 캐싱을 제공한다고?

Introduction 회사 슬랙 채널에 재밌는 글이 올라왔다. 에서 배우기로, 기본적으로 서로 다른 두 객체는 갖는 값에 상관없이 힙 영역 내 서로 다른 주소 번지에 위치하게 된다. 그렇다면 위의 예시에서 같은 값을 서로 다른 두 Integer 객체 a, b에 대해 비교하면 둘다 false가 나와야 정상일 것이다. 그런데 위의 코드를 실행하면 아래와 같은 결과가 나온다. public static void main(String[] args) { // case 1 Integer a = 127; Integer b = 127; System.out.println(a == b); // true // case 2 Integer a = 128; Integer b = 128; System.out.println(a ==..

Java 2022.06.16

JPA & ORM이란? (Feat. NoSQL에서 ORM?)

JPA란? 자바 표준 ORM(Object Relational Mapping). ORM(Object Relational Mapping)이란? 객체(Object)와 관계형 데이터베이스(Relational DB)를 연결(mapping)해주는 놈! Why JPA? 현대 웹 애플리케이션에서 관계형 데이터베이스는 빠질 수 없는 요소. 그러다 보니 객체를 관계형 데이터베이스에서 관리하는 게 무엇보다 중요해졌다. 문제는 RDB가 웹서비스 중심이 되면서 모든 코드가 SQL 중심이 되어버렸다는 것. 현업 프로젝트 대부분이 애플리케이션 코드보다 SQL로 가득해져버린 것이다. 이는 RDB가 SQL만 인식할 수 있기 때문인데, SQL만 가능하니 각 테이블마다 기본적인 CRUD 관련 쿼리를 매번 생성해야 한다. 예를 들어 Use..

Java 2022.06.02

[Java] Varargs란 무엇인가

vararg란 무엇인가 What is varargs in Java? 자바 메소드를 하나 만든다고 가정하자. 하지만, 우리는 이 메소드가 받아들이고자 하는 인자가 얼마나 많을지 장담할 수 없다. 이를 해결하기 위해, Java 1.5 버전에서 varargs를 도입했다. Varargs는 variable arguments의 준말이다. 자바에서, 메소드의 인자는 임의의 value 개수를 받을 수 있다. 이렇게 value의 변수 개수를 받는 인자를 varargs라고 한다. accessModifier methodName(datatype... arg) { // method body }varargs를 정의하기 위해, … (점 세 개)가 메소드의 파라미터로 사용된다. 인자의 변수 개수를 받는 메소드를 variable-ar..

Java 2022.05.26