본문 바로가기

가치관 쌓기/개발 돌아보기44

영속성 처리하는 Method에 @transactional는 항상 붙이는게 맞을까? 문제 오늘 회사에서 특정 기능을 배포하자마자 문제가 발생했다. 핀포인트에서 발생하고 스택 트레이스는 다음과 같았다. > lazyinitializationexception could not initialize proxy Spring Boot, JPA 활용하는 개발자에게는 흔히 발생되는 예외중 하나이다. 이 예외가 발생하게된 이유는 무엇일까? 코드를 통해 이해해보자. @Entity public class Order { private long id; @OneToMany(mappedBy = "order", fetch = FetchType.LAZY) private List orderItems; } public interface OrderRepository extends JpaRepository { } @Servi.. 2024. 4. 20.
잘 알아보고 사용하자 Java Annotation(주석) 오픈소스를 개발하면서 @AggregateId 라는 필드를 추가할 적이였다. Id 에 대해서 자동생성시키기 위한 @AggregateId(assignStrategy=AUTO or MANUAL) 같이 만들고자 했으나, 그렇게 하면 안될 것 같다는 피드백을 받았다. 왜일까? Java 에서 쓰이는 Annotation 은 무엇인가? 위키 백과 따르면 다음과 같다. 자바 애너테이션(Java Annotation)은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종이다. 보통 @ 기호를 앞에 붙여서 사용한다. JDK 1.5 버전 이상에서 사용 가능하다. 자바 애너테이션은 클래스 파일에 임베디드되어 컴파일러에 의해 생성된 후 자바 가상머신에 포함되어 작동한다. 여기서 말하는 메타데이터는 무엇일까? 메타데이터(m.. 2024. 3. 10.
왜 코드 리팩토링을 수행해야 될까? 지극히 개인적인 생각으로 다른분들과 생각이 다를 수 있습니다. 들어가기 개발을 하면서 코드가 '다소 객체지향적이지 않다'는 느낌의 코드 나래비를 목격하는 경우가 더러 있다. 그럼 우리는 이따금씩 이런 생각이 든다. '이거 내가 좀더 객체지향스럽게 디자인패턴이나 적절한 메소드나 용어를 활용하여 고칠 수 있을 것 같은데?' 라고 말이다. 그리곤 코드를 수정한다. 그리고 배포한다. 과연 이 의식의 흐름대로 행동하는 것이 맞을까? 개발하고 있는 서비스에서 유사한 일이 나에게 반복적으로 발생했다. 이것은 과연 문제일까? 아닐까? 개발자로서 장인정신에 입각하여 당연히 해야되는 것은 아닐까? 나는 리팩토링을 통해 무엇을 얻고 싶었던 걸까? 어떤 코드를 보고 위에서 언급한 것처럼 의식의 흐름으로 고치던 리팩토링을 어느.. 2023. 9. 26.
코드가 부채다. - 일주일간 작성한 코드를 오늘 삭제했다. 들어가기 최근에 아주 조금 내가 성장했다고 느낀 계기가 있었다. 최근 회사에서 개발자의 유후 시간이 약 한 달정도 주어졌다. 이 기간동안에는 직군별로 미쳐 시간이 없어 하지 못했던 작업을 할 수 있는 시간이 주어졌다. 기술부채로 쌓여있던 해야될 것을 나열하며 그 중 하나로서 '콘텐츠 슬롯 A/B 테스트 가능한 구조 적용하기' 가 나의 미션이였다. 무엇인지 문장만 보고 이해할 때는 말 그대로 'A/B 테스트가 가능한 구조'를 만드는게 우선이지 않을까? 라는 생각을 하며 동작하는 코드를 살펴보니 실제 동작도 하드 코딩으로서 A/B 테스트를 처리하고 있었다. 여기서 A/B 테스트란? 사용자를 A/B 군집으로 나누어 비지니스 로직/UI 등을 다르게 전달하여 더 나은 선택지를 데이터로서 찾기 위한 수단이다. 하드.. 2023. 7. 31.
Lombok 동작 원리 이해하기(with. Annotation Processor) - 1 들어가기 Java 진영에서 Lombok 은 프로젝트 개발시 Must have Item 처럼 사용되곤한다. 그렇게 된 결정적인 이유는 Java 에서 관례적으로 주로 사용되는 Getter/Setter 를 애노테이션으로 쉽게 해결할 수 있기 때문이다. 그렇다면, Lombok 에서 자주 사용되는 Annotation 은 어떻게 동작하는 걸까? 그리고 Java의 Annotation 은 무엇일까? 엔지니어로 살아온 꽤 긴 시간동안 함께했지만, 깊게 살펴보지 못했던 Lombok 의 Annotation 동작 원리를 이해해보자. Annotation 이란? Java Annotation 은 Lombok 처럼 사용되기 위해 만들어진 것은 아니였다. wiki 를 살펴보면 다음과 같다. In the Java computer pro.. 2023. 7. 29.
다형성과 OCP(Open Closed Principle)은 무슨 관계일까? [리팩토링] 다형성을 이용한 IF 문 제거하기 들어가며 코드를 통해 본격적으로 다형성을 이용한 IF 문 제거하기 를 들어가기 앞서, 왜 IF문을 제거해야 하는지 부터 이해해보자. IF 문을 제거해야 하는 이유로 2가지를 말할 수 있을 것 같다. happy-coding-day.tistory.com 해당 포스팅을에 대한 지인이 피드백을 주셨는데, 몇가지 생각해볼만 부분이 있었고, 관련해서 이야기해보려 합니다. 2가지 맥락으로 이야기할 수 있으며, 다음과 같습니다. 1. Handler 클래스는 여전히 OCP 를 해결 할 수 없다. 2. 다형성과 IF 문을 제거하는 것은 서로 다른 것으로 결이 다른 두 개이다. 언급한 포스팅을 살펴보면, IF 문을 제거하기 전, IF 문의 단점으로 언급한 OCP가 있습니다. 그.. 2023. 5. 27.
[리팩토링] 다형성을 이용한 IF 문 제거하기 들어가며 코드를 통해 본격적으로 다형성을 이용한 IF 문 제거하기 를 들어가기 앞서, 왜 IF문을 제거해야 하는지 부터 이해해보자. IF 문을 제거해야 하는 이유로 2가지를 말할 수 있을 것 같다. 인지 과부하 OCP(Open closed principle) 인지 과부하 IF 라는 키워드를 사용하게 되면, 필연적으로 우리의 두뇌는 IF ELSE 을 고민하게 된다. if(...) { // do Something A } else { // do Something A else... } if 가 한 개일때는 우리의 두뇌는 문제 되지 않는다. 2가지의 경우의 수만 고민하면 된다. 여기에 if문을 중복으로 추가하게 되면 어떻게 될까? if(...) { // do Something A if (...) { // do S.. 2023. 5. 21.
변경을 가하기 두려울 정도로 코드가 복잡할 때, 우리는 어떻게 코드를 이해할 수 있을까? 아래 내용은 '레거시 코드 활용 전략 - 마이클 C. 페더스' 에서 발췌한 내용입니다. 우리는 개발을 하다보면 이런 상황을 겪고 합니다. 종종 이해하기 어려울 정도의 코드를 마주치기도 하고, 코드를 수정하려고 보니 겁이 나는 그런 상황이요. 우리는 이럴 때 어떻게 행동하게 되나요? 두려움을 이겨내고 코드 수정을 바로 이어가나요? 그렇게 했을 때 우리의 코드는 마치 비웃듯이 git rollback 을 하라고 소리치곤합니다. 그런 상황에서 써먹을 수 있는 간단하지만 강력한 방법을 소개하고자 합니다. 1. 노트와 스케치 활용하기 저도 자주 사용하는 방식인데, 어려운 코드보다는 도메인에 대한 이해도를 높이기 위한 수단으로 사용해왔습니다. 이해하고 싶은 코드의 도식화를 직접 그려보는 것입니다. 아주 단순하지만 강.. 2023. 4. 29.
개발DB 꼭 필요한가요? 진짜 필요한거예요? 배경 회사를 옮기고 적응하는 과정에서, 개발 DB 대한 고찰을 하게 되었다. 스타트업 회사는 제한적인 리소스에서 최고의 효율을 내야만 했던 회사였으며, 이번에 옮긴 회사는 리소스가 풍부했기 때문에 무엇이든 할 수 있었다. 그 과정에서 '개발 DB는 무엇을 위해 필요로 하는가?'에 대한 생각을 하게 되었다. 들어가기 개발자가 일하는 대부분의 환경은 다음과 같은 형태로 일을 하게 된다. 프로덕트 DB(Product DB) ----- 개발 DB(DevelopDB) ----- 로컬(LocalDB) 이런 형태는 하나의 기능을 개발하고 테스트해서 최종적으로 릴리즈 되기 까지 3가지 타입의 DB을 활용하게 된다. 동작되고 있는 프로덕트에 릴리즈하기 직전까지 개발자들끼리 기능 구현시 활용하는 DB는 개발 DB. 기능을.. 2023. 2. 24.
왜 테스트 코드를 작성하는 걸까? 트레바리에서 혼자 3주라는 아주 짫은 시간에 구독 서비스을 만들었다. 낮밤, 주중/주말을 가리지 않고 정해진 기한 내에 개발을 마치고 싶었다. 여유 없이 기한내에 개발을 하다보니, 스스로 끊임없이 일정을 핑계삼아 올바른 길보다는 빠른 길을 찾으려는 타협점을 끊임없이 찾으려 했다. 트레바리의 개발 문화는 테스트 주도 개발 이라는 (사실 거창한건 아니지만) 문화을 CTO님이 최우선을 둔다. 나 또한 CTO 님의 영향 덕택에 테스트 코드을 마치 습관처럼 작성한다. 테스트 코드의 장점은 CTO 님 덕택에 직접 몸소 느끼고 있다. (장점에 대해서 중심으로 이야기하지는 않을 예정이다.) 구독 서비스을 만들면서 빠른 길을 찾기 위해서 습관처럼 작성하던 테스트 코드을 중간부터는 스킵하고 넘어가기 일쑤였다. 그러다 보니.. 2022. 10. 29.
DB AutoIncrement 가 아니라, 왜 굳이 IDGenerator Server 을 만들었을까? 추가) 관련 IDGenerator 오픈소스을 만들었습니다. ( github link ) 배경 @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; } 위 코드는 어떤 코드인지 짐작이 가는가? JPA 을 학습한 사람이라면 한번에 인지했을 것이다. 데이터베이스에 어떤 데이터을 저장시키기 위해서 데이터베이스에게 오름차순의 숫자을 요청하여 식별자 을 생성해내는 코드이다. 포스팅 제목에서 보았던 IDGenerator 종류의 하나이다. 이 쯤에서 제목에서 말하는 IDGenerator 는 무엇인지 이해할 필요가 있다. 앞에서 이미 언급된 '식별자' 을 만들어 주는 것이 IDGenerator 의 역할.. 2022. 10. 5.
Mockito을 왜 쓰는지 모르겠다? (with. Test Double) 안녕하세요. 렌입니다. 오늘은 우리가 테스트 코드 작성할 때마다 Mockito 을 사용하는데, 왜 사용하는지 대해서 조금 더 깊게 이야기해볼까 합니다. 테스트하고자 하는 객체의 의존성을 격리한다. 라는 것이 우리가 흔히 아는 왜 사용하는지에 대한 답인데요. 여기서 Mocktio 는 Test Double 라는 큰 개념 안에 있는 하나입니다. Test Double에 대해서 알게 된다면 Mocktio 을 왜 사용하는지 조금은 이해할 수 있지 않을까요? When we are writing a test in which we cannot (or chose not to) use a real depended-on component (DOC), we can replace it with a Test Double. The .. 2022. 9. 22.
좋은 테스트에 대해서 이야기 하기 좋은 테스트에 대해서 이야기해볼까 합니다. 여기서 '좋은' 이라는 말은 개발자에게 언제나 고민의 시작이지 않았을까 싶습니다. 직접 테스트 코드를 작성하며 이 책(이펙티브 유닛 테스팅)에서 말하는 좋은 테스트에 대해서 공감이 되는 부분이 몃년이 지나서야 드디어 조금씩 알게되는 것 같습니다. 다음과 같은 주제로 이야기해보려 합니다. _2.1 읽기 쉬운 코드가 유지보수도 쉽다. _2.2 구조화가 잘 되어 있다면 이해하기 쉽다 _2.3 엉뚱한 걸 검사하는 건 좋지 않다 _2.4 독립적인 테스트는 혼자서도 잘 실행된다 읽기 쉬운 코드가 유지보수도 쉽다. 여기서 말하는 읽기 쉬운 코드란 어떤 코드를 말하는 걸까요? 그 가독성은 어떻게 채울 수 있을까요? 가독성 높은 코드? 가독성 이라는 단어는 눈으로는 이해할 수 .. 2022. 9. 18.
엄청 많은 속성을 가진 객체를 테스트해야 한다면 어떻게 해야될까?(with. test Data Builder) SETTLEMENT 라는 결제/환불 원장 프로젝트를 진행하면서 이야기했던 Test Data Builder 에 대해서 이야기해볼까 한다. Test Data Builder(테스트 데이터 빌더)란 어떤 건인가? 테스트 데이터 빌더를 이야기하기 전에 테스트 코드부터 이야기 해보자. 왜 테스트 코드를 작성하고자 할까? 왜 테스트 코드를 작성하고자 할까? 우리는 테스트 코드로서 무엇을 얻기 위해서일까? 어떤 문맥이냐?에 따라 테스트 코드가 우리에게 전달해주는 것은 다를테지만, 이야기하고 싶은 바를 먼저 말한다면- 안도감이다. 테스트 코드 덕분에 마음의 안정을 얻을 수 있다. 그것은 서비스를 개발하는 클라이언트에게 심리적인 안정감을 준다. '그럼 무조건 테스트 코드를 작성해야 되는거 아닌가?' 라는 생각이 드는 사람.. 2022. 9. 9.
적절한 마이크로서비스를 도입하는 시기는 언제일까? 지난 해 9월 트레바리 테크유닛으로 이직을 결정하게 된 주요 이유 중 하나는 마이크로서비스를 직접 구축 할 수 있는 기회에 있었습니다.. 이 후 약 8개월이 지난 이 시점에 '적절한 마이크로서비스를 도입하는 시기는 언제 일까?' 을 고민하는 것은 뒷북일 수 있지만, 이제는 이 부분에 대해서 어느정도 답을 할 수 있는 시점이 아닐까? 싶어 고민하게 되었습니다. 1. 다우기술에 근무할 적 약 90만 라인이 자바 코드가 모듈형 모놀리스 아키텍쳐로서 운영되는 프로젝트를 약 2년 넘게 관리했었습니다. 이 방대한 코드 속에서 마이크로서비스가 말하는 모놀리스 아키텍쳐의 단점을 운이 좋게도 모두다 겪어볼 수 있었습니다. 약 2주에 한 번씩 배포 빈도를 가집니다. 코드가 심각하게 방대해, 도메인에 집중할 수 없어 스파게.. 2022. 7. 9.
이벤트 스토어(?) 이벤트 소싱(?) 를 활용한 View 를 반복적으로 만들고 부수면서 느낀 점 결론부터 말씀드리면 '이벤트스토어를 활용해 내가 원하는 View 를 만들어 내기란 여전히 턱없이 내공이 부족하다.' 입니다. 먼저 이벤트스토어에 대한 이야기부터 해보려 합니다. 그 다음 반복적으로 만들고 부수면서 느낀 점 이야기 해볼까 합니다. 이벤트 스토어란 무엇일까? 이벤트 스토어가 없던 시절의 우리는 데이터베이스에 어떤 행위의 결과값만 포함시켜왔습니다. Actor에 의해 만들어진 어떤 결과물을 의미합니다. 그렇다면 이벤트란 무엇일까요? 사내에서 이벤트라는 용어를 비개발자분들에게 설명하기 위해 사용된 장표를 가져왔습니다. 이벤트는 특정시점에 발생한 어떤 사건을 의미합니다. 그러므로, 이벤트 스토어는 특정시점에 발생한 사건을 저장하는 것을 의미합니다. 이것이 가져다는 주는 이점은 무엇일까요? 1. 바로.. 2022. 7. 3.
REST API 에서 URL은 무슨 의미인지 살짝 맛 본 썰!! 이번에 멤버십 환불/해지 고도화 프로젝트를 하면서 API 에 대한 피드백이 있었습니다. 아래 "/v1/membership" 에 대한 API 는 무엇을 의미하는 걸까요? 잠시 숨을 고르고 천천히 코드를 살펴봅니다. @GetMapping(value = {"/v1/membership"}) public String member(@RequestParam(value = "clubId") String clubId, @RequestParam(value = "userId") String userId, @RequestParam(value = "state") String state) { Member member = membershipGetUseCase.member(UserId.of(userId), ClubId.of(club.. 2022. 5. 19.
Layered Architecture 의 단점이 무엇이라고 생각하는가? 두번째 이야기 첫번째 이야기 ( https://happy-coding-day.tistory.com/189 ) Layered Architecture 의 단점이 무엇이라고 생각하는가? 들어가기 이전 포스팅의 내용이였던 DDD-Lite 동영상 시청 리뷰 의 내용을 정리하다가 문득 궁금증이 생겼습니다. 정명주 강사님께서 `Layered Architecture 의 단점으로 인해, Hexagonal(Onion) Architecture.. happy-coding-day.tistory.com 요즘에는 만들면서 배우는 클린 아키텍쳐라는 책을 읽고 있습니다. 이 책에서는 Layered Architecture 에 대한 단점을 언급하는 부분이 있어, 이 부분 또한 2탄으로 정리할 필요가 있겠다 라는 생각을 가졌습니다. 첫번째 이야기는 20.. 2022. 4. 13.
나쁜 냄새가 드는 한마디 "잠깐만요 코드좀 볼게요." "잠깐만요 코드좀 볼게요" 우리는 언제 이런말을 해봤을까요? 개발 업무를 하며 한번쯤은 우리가 말해봤거나, 반대로 누군가에 의해 들었던 말인데요. 오늘은 이 말이 의미하는 바에 대해서 이야기해보려 합니다. 근무하는 트레바리 테크유닛의 PE셀에서는 간단하면서도 도전적인 첼린지를 했습니다. 플랫폼 관련 업무만 하다 보니 프론트엔드 업무는 해본 적이 없었습니다. 그러다, 우연히 해볼 수 있는 기회가 생겨 약 3명의 개발자가 쿽하게 개발해볼 수 있는 기회가 생겼습니다. next.js 프레임워크에서 간단히 UI Form 이 변경되는 것이 이번 프로젝트의 목적이였습니다. 단, UI Form 이 보여지게 될 때 변경 전/변경 후 UI 가 특정 비지니스 로직에 따라 다르게 보여야만 했습니다. 특정 비지니스 로직? 이번.. 2022. 3. 6.
개발자는 '다형성을 활용한 리팩토링'을 수련해야 한다. 앞선 포스터에서 Interface Segregation Principle (인터페이스 분리 원칙) 에 대해서 이야기했다. 이제 본격적으로 인터페이스 분리 원칙을 함으로써 얻을 수 있는 실용적인 이익에 대해서 이야기해보려 한다. 또한, 인터페이스 분리 원칙과 테스트 코드를 함께 작성함으로써 다형성을 활용할 수 있는 냄새를 맡을 수 있었다. 같이 한번 살펴보자. 아래 테스트 코드에서는 메소드 하나가 너무 많은 역할을 한다는 냄새를 맡을 수 있다. @Test void execute_with_single_notificationTarget() { given(targetProvider.getTargets()).willReturn(List.of(target1)); given(factory.findBy(any()))... 2022. 2. 27.