분류 전체보기 261

@Transactional은 만능이 아닙니다 - 1: Transaction의 개념과 트레이드오프

Introduction 현재 작업 중인 프로젝트와 관련해 올렸던 PR에서 아래와 같은 리뷰를 받았다. Can you do it without getting @Transactional? @Transactional is not cheaper. Please think about why we use Transaction on RDBMS DB. 왜 이런 말이 나오게 됐을까? 먼저 원래 코드부터 살펴보자. 유저의 필드 중 하나인 날짜를 특정 시점으로 수정하는 API이다. 내부 코드를 공개할 수 없기에 간단한 형태로 수정했다. Code UserController @PutMapping("/user/{Id}") public void moveDateTime(@PathVariable long userId) { userSer..

Spring Data 2022.09.16

8월 월간 회고

OKR 진행 현황 1. 수습 통과하기(Done) LMS console: DynamicRule console migration 프로젝트(CRUD 기능 구현): 60%(7/31)→ 80%(8/31) LMS console: 내부 엔진 내 날짜 수정 기능 구현(첫 PR approve!)(프론트 100% & 백 90%) 백엔드 개발자 커리큘럼 달성 Java/OOP 이것이 자바다 2권 끝내기(15/16) → 사실상 stop.. Spring 스프링 핵심 원리 강의 끝내기 → Done!~~ 블로그 글쓰기 비개발 7월 월간 회고 스타트업의 결실은 누가 누리는가? [동료 피드백 회고]팀원들이 본 3개월 간 내 본모습은? 개발 [Java]SimpleDateFormat을 쓰면 안된다고? (feat.Thread-Safe) In..

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

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

Java 2022.08.29

[동료 피드백 회고]팀원들이 본 3개월 간 내 본모습은?

이번주는 초에 휴가 기간이 겹쳤던 데다 기록적인 비에 이것저것 정신없이 지내다보니 회고 글쓰기를 놓쳤다. 다음주 초에 올라갈 이번주 회고글과 별개로 저번주 회고글을 작성하려다, 마침 얼마 전 회사에서 진행했던 상반기 회고 프로그램에 속해있던 동료 평가 결과를 메일로 전달받았다. 메일 제목을 보고는 덤덤하게 “어, 왔네?” 했지만 막상 열어보려니 떨려서 엄두가 안 났다.. 한참 심호흡하고서 겨우 열어봤다. 생각보다 좋은 내용이 많아서 놀랐던 한편, 보완해야 할 부분을 잘 짚어주셔서 감사했다. 그나저나 개인에 대한 피드백이라는 건 꽤나 개인적인 이야기인지라 블로그에 공개하는 게 맞는지 고민했다. 하지만 동료들이 남겨준 소중한 피드백을 잘 새기는 것이 중요하고, 블로그에 올리는 글은 꽤나 신경써서 작업하기 때..

스타트업의 결실은 누가 누리는가?

망해가는 스타트업에서 가장 먼저 빠져나오는 사람은 똑똑한 사람이다. 능력도 출중한데다 리스크 계산에 머리 회전이 빠른 사람. 이들에게는 언제나 좋은 기회가 주어진다. 따라서 굳이 리스크를 감내할 필요가 없다. 회사에 망조가 보인다 싶으면 가장 먼저 뛰쳐나오는 게 이 부류다. 남아있는 사람은 어떤 사람들일까? 대체 이들은 어떤 사람들이길래, 무슨 생각을 갖고서 기울어가는 회사에 남아있는지가 궁금했다. 딱히 갈 곳이 없어서인가? 빚을 졌나? 당장 나가도 이상하지 않을 판국인데 왜 남아있는 걸까? 버티는 사람이 남는다. 버티는 이유는 저마다 다양하다. 받은 주식 수가 많아서일 수도, 베스팅이 끝나지 않아서일 수도 있다. 혹은 회사의 비전과 동화되어 여기서 포기하기엔 아직 이르다고 생각해서일 수도 있다. 그런데..

인사이트 일기 2022.08.08

7월 월간 회고

OKR 진행 현황 1. 수습 통과하기 - LMS console migration 프로젝트: 10%(7/1)→ 60%(7/31) 2. 백엔드 개발자 커리큘럼 달성 - Java/OOP - 이것이 자바다 2권 끝내기(~8/15) (총 4챕터 완료) - Spring - 스프링 핵심 원리 강의 끝내기(~7/30) (현재 72.15% 달성) 1. Keep 데일리 리포트 작성 저번 주 Try로 선정된 Action item이었던 데일리 리포트를 일주일간 썼다. 업무 일지와 병행해서 써서 그런지 예전과 달리 매일 적는 게 훨씬 수월해졌다. 업무 일지를 꾸준히 쓰는 버릇이 들여서 새로운 습관을 얹는데 드는 부담이 크지 않았다. 쓰면서 느낀 건데, 컨디션이 좋지 않은 날에는 데일리 리포트를 꾸준히 쓰는 것 역시 힘들어졌다...

[SpringBoot]GET API route 중복 issue 에러 해결 & SpringBoot와 React는 어떻게 통신하나?(Feat. Tomcat)

Abstract localhost:8080/ 페이지 요청 시 스프링부트에서 리액트 화면을 불러오는 과정에서 Whitelabel Error Page 에러 발생 서버 단 에러 로그 확인 시 MethodArgumentTypeMismatchException와 NumberFormatException이 발생 → 프론트 단의 index.html을 불러오는 과정에서 이슈가 발생 MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; nested exception is java.lang.NumberFormatException: For input string:..

Spring 2022.07.29

7월 4주차(7/18 - 7/24) 회고

이번주 점수는? ⭐⭐⭐ 이번 주 목표 (7/18 - 7/24) LMS console migration -CRUD 유저스토리 완료 C(완료), RUD(진행 중) (25%) 스프링 핵심 원리 강의 끝내기 → N 이번주는 강의 아예 듣지 못함…ㅠ (0%) Ch.13 제네릭까지 Done!(100%) 😍 Keep 1일 1커밋: 매일 공부하기의 소중함 확실히 1일 1커밋을 의식하니 어떻게든 짬을 내서 공부하게 된다. 때로는 형식적으로 커밋할 때도 없잖으나, 이것이 있음으로 해서 조금이라도 하려고 노력하게 된다. 소중한 루틴이니만큼 계속 가져가도록 할 것. 대시보드 생성 및 시각화 → 모든 곳에 붙여놓고 상기하기 상반기 회고 및 하반기 OKR을 수립하면서 하반기 OKR을 노션 여기저기 붙여뒀다. 확실히 현재 어디로 ..

빠르게 성장하기 위해서는 무엇이 가장 중요할까? (2022 하반기(H2) OKR)

2022 하반기(H2) OKR 상반기 회고에 이어서 이번에는 하반기 OKR. 은근히 시간이 꽤나 많이 소요됐다. 물론 그만큼 충분히 공을 들일 만한 시간이었다. 상반기 OKR 역시 작년에 세워놓지 않았다면 지금까지 어디로 가야할지 꽤나 헤맸을 게 분명하니까. 다만, 이번에 OKR을 세우기 위해 관련 도서 를 짧게 읽어보며 느낀 건 목표를 세우고, KR을 달성하고 회고하는 기간을 좀 더 짧게 가져갈 필요가 있겠다는 것이었다. 일단은 반기 목표(6개월)을 세웠지만 계속 들여다보면서 3개월 x2로 기간을 짧게 여러번 가져갈 생각이다. 한 번 공을 엄청 들여서 쓴다고 한들 아래 목표를 100% 달성한다는 보장이 없다. 목표를 너무 거창하게 잡았을 수도, 너무 작게 잡았을 수도, 또는 나중에 가려는 방향이 바뀔 ..

[LeetCode][Java/Python]53. Maximum Subarray

Java Solution class Solution { public int maxSubArray(int[] nums) { //Solution 1: my solution /** Runtime: 9 ms, faster than 5.84% of Java online submissions for Maximum Subarray. Memory Usage: 74.1 MB, less than 41.86% of Java online submissions for Maximum Subarray. 시간복잡도: O(n) - 아래 나올 Solution 2와 동일한 시간복잡도이나 매번 dp 값을 갱신하기 위해 참조해야 하는 점에서 중간에 품이 들어가는 듯. 공간복잡도: O(n) - dp array를 n개 원소만큼 생성해야 함 */..