분류 전체보기
-
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년 초 졸업을 한 학기 앞두고 나는 정말 힘들었다. 나름대로 학교에서 열심히 공부했고, 성적도 좋았다. 하지만 학교 공부를 열심히 한다고, 개발자가 될 수는 없었다. 개발자로서의 취업은 정말로 막막해 보였다. 사실 더 큰 문제는 남들과의 비교에서 오는 좌절감이었다. 흔히 취업을 했다는 사람들의 포트폴리오, 깃허브 코드를 보면 나의 결과물은 너무 초라했다. 내가 과연 개발자라는 직업을 가질 수 있을까 매일 걱정했다. 나는 똑똑하지 못하다. 그래서 내가 선택한 방법은 매일 밤을 새워서, 공부하고 개발했다. 개발하다 해 뜨는 것을 보는 건 기본이었다. 그리고 하루 종일 내가 만든 애플리케이션을 ..
-
Stream은 일회용품이다.Java & Kotlin 2021. 12. 12. 23:16
1. 서론 코딩, 프로그래밍을 하는 데에는 각자의 취향이 분명 있을 것입니다. 하지만 무엇이 옳다고 말할 수는 없는데요. 다양한 프로그래밍 방식 중 저는 무엇인가를 조회할 때 각각 변수에 담아, 다시 사용하는 것을 좋아합니다. JPA에서 사용되는 쿼리 메서드를 예로 들겠습니다. 누군가는 애초에 변수 b만 들어서, a의 내용을 join으로 한 번에 가지고 오기도 합니다. 혹은 변수 자체를 만들지 않고, 바로 return에 조회하는 메서드를 사용하기도 합니다. 하지만 저는 세번째와 같이 변수에 하나하나 담아, return 하는 방식을 선호하는데요. 이유는 각각의 의도를 가진 변수명을 사용해서, 어떤 목적을 가지고 있는지 명확히 알 수 있습니다. 또한 어떤 부분에서 에러가 발생하는지 명확히 파악할 수도 있습니..
-
그래서 예외처리는요?Java & Kotlin 2021. 12. 5. 05:30
1) 서론 개발자로서 취업 후 가장 많이 배우는 것 중 하나는 예외처리일 것 같습니다. 혼자서 개발할 때는 모든 상황의 예외를 파악할 수 있습니다. "이 부분에서는 절대로 에러가 나지 않는다"라는 확신이 들기도 합니다. 왜냐하면 혼자서 정해진대로 테스트를 진행하기 때문에, 예상 가능한 문제만 발생합니다. 하지만 실제 업무에서는 절대로 예상할 수 없습니다. 당연히 들어와야 하는 파라미터가, 그냥 안 들어오는 경우도 있습니다. 사용자는 정해진대로 움직이지 않고, 복잡한 시스템은 항상 예기치 못 한 에러를 만들어냅니다. 당연히 있어야 할 것이, 당연히 없는 경우가 대부분입니다. 신입으로서 코드를 작성할 때 가장 많이 들은 질문입니다. "그래서 예외처리는요?" 2) 고작 파라미터 받는데요? 이번 글에서는 흔하게..
-
JPA 지연 로딩, 결국 ProxySpring Framework 2021. 11. 21. 23:42
1) 서론 JPA가 적용된 서버의 로그를 보면, LazyInitializationException이 빠지지 않고 항상 올라오곤 합니다. 일주일에 한 개씩은 발생하는 에러 같은데요. 사실 이는 단순한 문법적 오류이며, 하이버네이트가 어떤 식으로 지연 로딩하는지에 대한 깊은 이해가 부족하기 때문이라고 생각합니다. "그냥 get()하면 가지고 오는 거 아닌가?"라고 생각하기 쉽습니다. 저 또한 그랬습니다. 결론부터 말씀드리면, 스프링 프레임워크에서 지겹게 사용되는 프록시가 원인입니다. 해당 에러들을 해결하며 공부한 것을 정리해보겠습니다. 2) 에러 코드 (모든 코드는 임의로 만들어낸 상황입니다) 테스트 코드는 아직 부족합니다. 참고만 해주세요. public class Player { ... 생략 ... @Ma..
-
GitHub 브랜치 단위로 PR 하기 - 기초편-Contribution 2021. 11. 14. 01:26
1) 서론 그동안 혼자서 깃허브 저장소를 만들고, 로컬에서 그대로 push 하는 방식을 사용했었습니다. 아마도 함께 공부하고 협업했던 경험이 없었던 것이 이유일 것 같은데요. 하지만 막상 개발자로서 취업 후 하나의 origin(remote) 저장소를 기준으로 fork, branch, PR 등 다양하게 사용하고 있었습니다. 이는 협업을 바탕으로 저장소 관리와 기록을 편리하게 위함인데요. 처음에는 push 잘 못했다가 문제가 생기지 않을까 두려움에 떨기도 했었습니다. 딱히 알려주는 사람도 없었구요. 그래서 다시는 잊지 않으려고, 일련의 흐름을 간단히 기록하려고 합니다. 참고로 이 글에서는 Java 파일을 기준으로 합니다. 하지만 다른 언어 파일 혹은 단순 텍스트 파일도 관계없습니다. HTML 삽입 미리보기할..