전체 글
-
Optional 아무렇게나 사용하고, 장애 발생시킨 이야기Java & Kotlin 2022. 3. 15. 01:09
1) 서론 당연한 것이라고 생각하며 한 번도 의심해보지 않은 것이, 사실은 아니었던 경험이 있으신가요? 저는 TV에서 나오는 맞춤법 퀴즈를 볼 때 종종 "이게 정답이라고?" 라는 생각을 하기도 하는데요. 최근 개발을 하던 중 사용한 Java의 Optional이 저에게는 그런 존재입니다. Java8의 시대부터, 아마도 자바 개발자에게 Optional의 사용은 필수가 됐을 것 같습니다. 저는 NPE를 방지하기 위해서, 습관적으로 사용하곤 했었는데요. 이러한 Optional을 무분별하게 사용하다가, 시원하게 장애를 발생시킨 경험입니다. 2) 상황 설명 값을 조회합니다 값이 있다면, Exception 발생합니다. Post 테이블의 title이 'title'인것을 조회합니다. 데이터는 존재하지 않습니다. 앞서 '..
-
짐 덩어리, Git 브랜치 삭제 적용해본 이야기Contribution 2022. 2. 27. 23:57
1) 서론 이 글을 읽는 대부분은 이사를 해본 경험이 있을 것입니다. 그리고 아마도 "왜 이렇게 짐이 많지? 이걸 왜 안 버리고 있었을까?"라는 생각을 한번쯤은 해보셨을 텐데요. 지금은 쓸모없어 보이는, 구석에 어딘가 둔 물건이 과거의 나에게는 소중했었을 것입니다. 혹은 미래에 소중할 것이라고, 당시에 생각했었을 수도 있고요. 하지만 중요한 건 현재의 내가 느끼는 필요성일 텐데요. 모든 기준은 현재의 나 자신입니다. 과거를 후회하는 것도, 미래를 희망하는 것도 현재의 나 자신입니다. GIt도 마찬가지입니다. GIt이라는 VCS로서 역사를 기록하지만, 결국에는 마지막으로 merge 된 최종본이 중요합니다. Git의 역사를 기록하는 방법 중 하나인 branch를 더 깔끔히 유지하는 방법에 대해서 알아봅니다...
-
착한 가로채기, InterruptedExceptionJava & Kotlin 2022. 2. 21. 03:16
1) 서론 JVM은 Java 언어가 어떠한 운영체제와도 동작할 수 있도록 도와주는 가상 머신입니다. 기계어로 바로 변환되는 C언어와 다르게, byte code로 변환 후 필요시 native code로 변환하고 읽는데요. "Write once, Run anywhere"라는 자바 언어를 만들던 당시의 철학을 떠올려보면, 당연한 동작 방식 입니다. JVM은 단순히 코드를 변환해주는 역할만 하지 않습니다. 운영체제 위해서 애플리케이션과 메모리를 관리하는 역할도 하는데요. 특히 프로세스, 스레드 관리를 매우 철저하게 해 줍니다. GC와 같이 사용되지 않지만, 메모리에 올라와있는 코드를 정리해주기도 합니다. 특히 스레드가 deadlock에 빠졌을 때 JVM은 그냥 두고만 보지 않는데요. 이때 발생할 수 있는 Int..
-
[Intellij] Google Java auto-formatting 적용Java & Kotlin 2022. 2. 7. 01:06
1) 서론 여러 사람이 함께 코드를 작성할 때는 다양한 스타일의 코드가 작성됩니다. 같은 목적의 코드라도, 개개인의 스타일은 다를 수밖에 없는데요. 만약 큰 회사 혹은 조직이라면 통일된 코드 스타일을 만들수도 있을 것입니다. 하지만 작은 조직에서는 체계적인 코딩 스타일을 정의하는 것이 쉽지 않을 것입니다. 통일된 코딩 스타일을 정의하는데 시간을 투자하는것 보다, 빠르게 개발해서 비즈니스에 반영하는 것이 우선이라는 이유도 있을 것 같은데요. 그래서 이번에는 인텔리제이와 구글 스타일 가이드를 이용해서, 완벽하지는 않지만 손쉽게 코딩 스타일을 통일시킬 수 있는 방법을 기록합니다. 2) 구글 자바 스타일 가이드 적용 방법 https://github.com/google/styleguide (구글 스타일 가이드 저..
-
JPA cascade 멈춰!Spring Framework 2022. 2. 2. 18:23
1) 서론 업무 중 수십 개의 테이블에 걸친 데이터를 한 번에 지워야 하는 API를 만들어야 했습니다. 처음에는 고작 CRUD인데, 금방 하겠지라는 마음을 가지고 시작했습니다. 이때 생각지도 못 한 어려움을 만났는데요. 하마터면 관련 없는 데이터까지 삭제할 뻔했습니다. 왜 이러한 일이 발생했는지 재현 후 기록합니다. 2) 전체 구조 2. 1) DB 스키마 User, Role, Post 테이블이 있습니다. User, Role을 연결시켜주는 User_Role 매핑 테이블이 존재합니다. 2. 2) Entity 글과 관련 없는 애노테이션들은 모두 생략했습니다. @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) p..
-
@Transactional rollback과 테스트 의문점Spring Framework 2022. 1. 24. 00:52
1) 서론 업무 중 특정한 경우에 count +1 후 exception을 발생시켜야 하는 로직이 필요했었습니다. 하지만 해당 메서드는 @Transaction이 반드시 필요했고, exception이 발생하면 rollback 되는 현상이 있었습니다. 이를 해결하기 위해서 테스트 코드를 나름대로 작성했는데요. 이 과정에서 의문점이 생긴 이야기입니다. 2) 전체 흐름 실제 업무에서 사용한 내용이 아닌, 기록을 위해 작성한 코드입니다. 상황 설정이 매우 억지스러운 것은 이해 부탁드립니다. private final PostRepository postRepository; private static final String unAuthorizedTitle = "어드민"; @Transactional public void ..
-
Redis contributor 된 이야기Contribution 2022. 1. 9. 18:07
1) 서론 Redis 공식 깃허브 저장소에 PR 후 merge 된 이야기입니다. 수정 내용은 매우 허접하니, 주의하세요! Redis 저장소: https://github.com/redis/redis 해당 PR: https://github.com/redis/redis/pull/10072 2) 왜 주말에 Redis 코드를 봤을까? 저는 개발자가 된 지 약 3개월 1주 정도가 지난 주니어 개발자입니다. 혼자서 개발할 때는 제가 작성하는 코드가 나름대로 "좋은 코드"라고 부를 수 있다고 생각했었습니다. 왜냐하면 작성하는 사람과 좋은 코드를 정의한 사람은 저 한 명이니까요. 하지만 회사에서 개발을 하면서 느낀 것이 있습니다. 10명의 코드에는 10가지 스타일이 있고, 각자 생각하는 좋은 코드의 스타일은 다르다는 겁..
-
(2021년 회고) 나는 정말 개발자가 되고 싶었다.회고 2022. 1. 1. 03:56
회고와 일기 성격의 글이며, 다듬지 않고 생각나는 데로 작성했습니다. 1) 나는 정말 개발자가 되고 싶었다. 2021년 초 졸업을 한 학기 앞두고 나는 정말 힘들었다. 나름대로 학교에서 열심히 공부했고, 성적도 좋았다. 하지만 학교 공부를 열심히 한다고, 개발자가 될 수는 없었다. 개발자로서의 취업은 정말로 막막해 보였다. 사실 더 큰 문제는 남들과의 비교에서 오는 좌절감이었다. 흔히 취업을 했다는 사람들의 포트폴리오, 깃허브 코드를 보면 나의 결과물은 너무 초라했다. 내가 과연 개발자라는 직업을 가질 수 있을까 매일 걱정했다. 나는 똑똑하지 못하다. 그래서 내가 선택한 방법은 매일 밤을 새워서, 공부하고 개발했다. 개발하다 해 뜨는 것을 보는 건 기본이었다. 그리고 하루 종일 내가 만든 애플리케이션을 ..