본문 바로가기
반응형

전체 글320

[DB] update set에서 주의할 점 최근 update 쿼리를 짜면서 겪었던 실수를 공유해보려고 한다. 일단 간단한 테스트 데이터를 준비해보았다. insert into test_menu (name, price, deleted) values (' 커피 ', 5000, 0); 여기서 name의 앞뒤에 공백이 들어간 데이터들에 대해 update 작업을 실행하려고 한다. 아래는 name은 trim 처리하고, price를 1000으로 변경하는 쿼리이다. update test_menu set name = trim(name) and price = 1000 where name like ' %' or name like '% '; 하지만 실제 결과를 보면 뭔가 이상하다. name에는 0이라는 값이 들어갔고, price는 변경되지 않았다. 당연한 이야기다. 왜.. 2023. 11. 19.
@Async와 함께 사라지다 (feat. TaskDecorator) 목차 1. 스레드가 가진 데이터, ThreadLocal 2. 데이터가 사라졌어요 (예제코드) 3. 비동기와 사라진 데이터 3. ThreadLocal 유지하기 1. 스레드가 가진 데이터, ThreadLocal ThreadLocal는 각 스레드마다 별도의 내부 저장소를 지원해준다. 일반적으로 지역 변수는 해당 변수를 선언한 코드 블록 내에서만 사용 가능하지만, ThreadLocal를 이용해 저장한 데이터는 데이터를 저장한 스레드 내에서라면 어디서든 사용 가능하다. 예를 들어 아래와 같이 ThreadLocal에 자주 사용되는 사용자 정보 등을 저장할 수도 있다. 사용자 정보를 저장하고 싶을때는 UserSessionContext.set(), 꺼내오고 싶다면 UserSessionContext.currentSe.. 2023. 10. 29.
[Spring Batch] JobExecutionAlreadyRunningException 에러 🤯 에러 발생 Spring Batch에서 job을 실행하다가 아래와 같은 에러와 마주쳤다. java.lang.IllegalStateException: Failed to execute ApplicationRunner ... Caused by: org.springframework.batch.core.repository.JobExecutionAlreadyRunningException: A job execution for this job is already running: JobExecution: id=4223, version=1, startTime=2023-08-21 19:14:19.0, endTime=2023-08-22 15:38:48.0, lastUpdated=2023-08-21 19:14:19.0, st.. 2023. 10. 16.
[책 후기] 사라진 개발자들 저자: 캐시 클라이먼 출판사: 한빛미디어 책 링크: https://hanbit.co.kr/store/books/look.php?p_code=B4793001395 1. 책을 읽기 시작하며 개인적으로는 정말 재밌게 읽었다! 이 책의 유일한 단점을 꼽자면 어려운 이름라고 생각한다. 나는 사람 이름을 정말 못 외우는 편이라 기억하기 힘들었다. 영어 이름은 퍼스트네임, 미들네임, 라스트네임에 친한 사람들이 부르는 애칭도 따로 있다 보니 그래서 얘가 누구라고? 멈칫거리기도 했다. 처음에 10p 정도 읽다가 덮고, 아이패드와 함께 이름을 메모해 가며 처음부터 다시 읽기 시작했다. 초반에는 인물과 기관명을 기억하느라 낑낑댔고, 중간쯤부터는 이야기가 재밌어서 단숨에 읽어버렸다. 위 메모를 보고 겁먹지말기를 바란다. 쓰다.. 2023. 10. 2.
[Mockito] Invalid use of argument matchers! 에러 😱 에러 발생 org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers! 2 matchers expected, 1 recorded 에러 아래와 같은 테스트 코드를 실행시키다 위와 같은 에러 로그를 만났다. var service = mock(MemberFindService.class); verify(service).findByIdAndName(anyLong(), "yeonlog"); 에러를 해석해보자면 argument matchers를 잘못 사용했다. 2개의 matcher가 예상되었지만, 1개만 존재한다. 이 의미를 이해하기 위해서는 argument matchers가 무엇인지 먼저 알아야한다... 2023. 9. 27.
[JPA] @Where 무시하기 DB에서 데이터 삭제를 하기 위해서는 크게 hard delete와 soft delete가 존재한다. hard delete: SQL의 DELETE문을 이용해 직접 데이터를 삭제하는 방법. soft delete: SQL의 UPDATE문을 이용해 삭제 여부를 저장하는 컬럼을 변경하는 방법. 표준으로 정해진 것은 아니지만 soft delete는 일반적으로 deleted라는 컬럼에 true/false를 알 수 있는 값을 저장한다. soft delete의 단점은 조회할 때마다 조회 조건을 추가하는게 매우 귀찮다. (일반적으로 조회는 삭제되지 않은 데이터들을 조회해야하니 where deleted = 0 같은 조건을 넣어야 한다.) 헌데 JPA에서는 정말 편리하게도 @Where라는 어노테이션을 제공해준다. @Where.. 2023. 9. 11.
[책 후기] 내 코드가 그렇게 이상한가요? 저자: 센바 다이야 출판사: 인사이트 책 링크: https://product.kyobobook.co.kr/detail/S000202521361 1. 읽게 된 계기 친구들과 하는, 주에 한 번씩 모이는 스터디가 있다. 독서를 할 때도 있고 처음 보는 기술을 맛보기 할 때도 있는데, 저번에는 '내 코드가 그렇게 이상한가요?'를 읽기로 했다. 책 제목부터 모두의 호기심을 잡아끌어서 만장일치로 책이 결정되었다. 내 코드가 이상한 이유는 뭘까? 본 글에서는 책을 읽으면서 이야기했던 내용들이나 인상 깊었던 내용들 위주로 정리해보고자 한다. 2. 책을 읽고 책을 읽고 요약한 것은 깃허브에 메모해두었다. 이 책은 굉장히 친절하다. 다른 책에서는 이론적인 개념과 코드를 보여주는데 그친다면, 이 책에서는 어떠한 개념에 대.. 2023. 9. 9.
[인프콘 후기] 2023 INFCON 1. 인프콘에 참가하다 🙂 어떻게 참가할 수 있었는가 때는 2023년 7월 18일 12시 48분. 인프콘 추첨 결과 공개까지 12분이 남은 시간이었다. 인프콘에서 누구보다 빠르게 추첨 결과 메일이 왔다. 설레는 마음을 가득 안고 메일을 열어보았으나, 낙첨이었다. 메일을 보며 현실 부정을 하고 있자 친절하게도 카카오톡을 통해서 낙첨 사실을 재확인 시켜주었다. 😭 트위터에 슬퍼하는 글을 남기자 준프님께서 개인 초대권을 주셨다. 준프님은 작년 인프콘 때 처음 만나뵙고 인연을 이어가고 있었는데 이렇게 도움을 받게 되어 너무 감사하고 행복했다. 🥹 정말 감사합니다ㅠㅠ) 아무튼 이렇게 인프콘에 무사히 참가할 수 있게 되었다. 🧐 작년과 달라진 것들 작년에는 그냥 같이 당첨된 친구들과 함께 돌아다니고는 했는데, 올해.. 2023. 8. 16.
[Git] 머지 커밋 revert 하기 🤔 git revert란? git revert란 일부 기존의 커밋들을 되돌리는 작업이다. git reset과는 다른 것이, git reset은 기존의 커밋을 아예 삭제해버린다. 하지만 git revert는 변경 사항을 되돌린 커밋을 하나 새로 생성한다. 예를 들어 아래와 같은 커밋 A, B, C가 있다고 가정해보자. (알파벳은 커밋을 구분하기 위해 임의로 붙인 이름이다.) 이 때 커밋 C의 변경 내역을 reset, revert를 통해 되돌린다면 어떻게 될까? 커밋 내역을 살펴보면 git reset은 커밋 C에 대한 기록이 아예 없어진다. git revert는 새로운 커밋 X가 생긴다. 커밋 X의 변경 내역을 살펴보면, 커밋 C에서 변경했던 코드들이 그 이전 상태로 돌아가있다. git reset을 사용하는.. 2023. 8. 13.
반응형