자바 14

[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

[Spring] Controller에서 String -> 날짜 타입 자동으로 변환하기(Feat. @DateTimeFormat 적용 안되는 이유 & JAVA에서 JSON을 변환하는 과정)

Introduction 모든 예제는 github에 올려뒀습니다 예전에 했던 작업에서 클라이언트로부터 날짜값을 받는데 쓰는 requestDTO를 만들었다. 날짜값이 클라이언트로부터 String 타입으로 들어오기에 requestDTO에서는 String으로 받고 서비스 로직에서 String을 LocalDateTime으로 변환하도록 로직을 짰다. UpdateDateRequestWithString package com.woony.core.domain.request; import lombok.AllArgsConstructor; import lombok.Getter; import lombok. import lombok.NoArgsConstructor; @Valid @Getter public class UpdateDa..

Spring 2022.10.06

[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] 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

[Java] 왜 main()에 들어가는 인자는 오직 String 배열 뿐일까?

자바에서 프로그램을 코딩하기 위해 가장 먼저 입력하는 코드가 있다. public class Example { public static void main(String[] args) { ... } } 바로 이놈인데, 왜 String[] args를 쓰는지 알 길이 없었다. 처음에는 그냥 받아들였는데, 곰곰이 생각해보니 대체 이놈의 정체가 무엇인가! main()이 필요한 이유는 → 자바 클래스에서 main()이 엔트리 포인트기 때문이다. (항상 main()부터 실행된다). 근데 왜 String[] args가 필요하지?! Java 클래스로 프로그램을 실행할 때, JVM은 길이가 0인 String 배열을 먼저 생성한 다음 main() 메소드를 호출할 때 매개값으로 이 배열을 전달한다. String[] args = ..

Java 2022.05.24

[Java]While문 & Switch문 함께 쓸 때 주의점

switch 문에서의 break 원래 while문에서 break를 사용하면 while문을 종료시키고 빠져나올 수 있다. 그런데 만약 while문 안에 switch문을 쓴 뒤, switch문에서 바깥을 감싸고 있는 while문까지 종료시켜야 할 경우라면 어떨까? 그냥 생각해보면 switch문의 특정 case에서 break넣으면 되는 거 아냐?라고 생각할 수 있는데, 이렇게 하면 문제가 발생한다. switch 문에서의 break는 case를 빠져나가는 용도로만 쓰이지 while을 종료시키지 않기 때문. 그렇다고 break를 두 번 쓰려니 이미 위의 break에서 switch문을 빠져나왔으니 아래 break로 가지 않는다. 어떻게 해야 할까? 결론부터 말하면, while문을 종료시키려면 while문에서의 조건..

Java 2022.05.23