본문 바로가기

자바12

리팩터링(3) - 하다보니 보이는 것들 지난 글에 이어 리팩터링을 하다보니 보이는 것들에 대해 작성해보겠습니다. 리팩터링은 단순히 코드의 개선을 의미하지 않습니다. 코드가 개선되는 만큼 리팩터링한 개발자의 성장, 팀원의 성장으로 이어집니다. 제가 리팩터링하면서 볼 수 있었던 모든 성장, 개선에 대해 설명해보겠습니다. 리팩터링한 개발자의 성장 앞선 글들을 보았다면 리팩터링을 하기 위해 많은 과정을 거치는 것을 알 수 있을텐데요. 그 과정을 거치다보면 자연스럽게 타인이 작성한 코드를 이해하는 능력이 길러집니다. 물론 매 PR마다 코드리뷰를 진행하지만 코드 리뷰를 하는 것과 직접 팀원이 개발한 코드를 사용하는 것은 정말 다른 일입니다. 위 PR의 64개의 comment 중 절반 이상을 제가 달았음에도 막상 직접 사용하려 할 때는 이 코드를 작성한 .. 2022. 9. 25.
리팩터링(2) - 문제 해결하기 지난 글에서 리팩터링의 필요성을 직접 느끼고 문제 상황을 정의한 경험을 공유했습니다. 이번 글에서는 문제를 어떻게 해결해나갔는지에 대해 작성해보겠습니다. 1. 각 도메인 코드와 알람 코드 분리 리팩터링하기 이전의 코드도 의존관계는 단방향으로 잘 흐르고 있었습니다. 각 도메인에서 알람을 참조하는 형태로 이뤄졌고, 알람은 외부 도메인에 대한 정보가 전혀 없었습니다. 덕분에 의존성에 대한 문제는 전혀 존재하지 않았습니다. 다만 각 도메인에서 알람을 전송하기 위한 코드들이 많이 있었고 이를 도메인에서 떼어내기 위해 여러 고민을 했고 최종적으로 도메인 이벤트라는 방법을 선택하게 됐습니다. 도메인 이벤트를 사용하면 다음과 같은 장점이 있었습니다. 절차지향의 코드를 객체지향 코드로 전환할 수 있다. 외부 패키지와의 .. 2022. 9. 24.
의존관계 분리 경험 공유(2) 안녕하세요. 땡쿠팀의 백엔드 개발자 후니입니다. 지난 포스팅에 이어서 강한 의존관계를 분리하는 방법을 소개하고자 하는데요. Separated Interface 패턴을 이용하여 의존관계를 분리한 제 경험을 작성해보겠습니다. Separated Interface? 개발을 하다보면, 서로 다른 두 개의 시스템 파트의 결합도를 줄임으로써 설계의 수준을 개선할 수 있습니다. 일반적인 구조를 부정하고 다른 패키지를 참조해야 할 때 이 패턴을 주로 사용할 수 있는데요. 구현체를 상대 패키지에 두고, 인터페이스를 현재 패키지에 위치시키는 것입니다. 그러면 클라이언트는 구현체에 대한 정보는 참조할 필요 없이 현재 패키지의 인터페이스만 참조하게 되겠죠? 문제 상황 단건 쿠폰을 조회할 때, 쿠폰과 연관된 예약 / 만남 정보를.. 2022. 8. 10.
의존관계 분리 경험 공유(1) 의존관계 분리 경험 공유(2) 안녕하세요. 땡쿠팀의 백엔드 개발자 후니입니다. 이번 포스팅에서는 땡쿠팀에서 겪은 패키지간 강한 의존을 막기위한 경험을 소개하고자 합니다. 땡쿠팀은 우아한 테크 코스 내에서 사용되는 쿠폰을 예약하고 사용하는 서비스를 제공하는데요. 따라서 예약이나, 만남 일정이 수락, 생성됨에 따라 도메인간 경계를 넘어 상태를 변화하거나 객체를 생성하는 코드들이 필요합니다. 비즈니스 요구사항에 맞게 개발하다보니 자연스럽게 의존성의 흐름이나 도메인 간 결합도를 느슨하게 하는 데 집중하게 됐습니다. 덕분에 여러가지 고민과 시도를 해보았는데요. 지금부터 패키지간 강한 의존을 끊어내기 위한 땡쿠팀의 고민과 경험을 단계적으로 설명해보겠습니다. 1단계. Domain이 올바른 역할을 하고 있는가? 땡쿠팀.. 2022. 8. 10.
[Spring] Spring Boot에서 트랜잭션 사용하기 일반적으로 하나의 비즈니스는 한 트랜잭션 내부에서 다룹니다. 비즈니스로직이 실행되는 도중 어떠한 이유로 메서드 실행이 중단된다면 지금껏 처리한 모든 쿼리가 롤백되어야 합니다. 체스 미션을 예시로 간단히 설명해보겠습니다. a2 포지션의 폰을 a4 포지션으로 옮기려면 a2 포지션은 blank로 a4 포지션은 폰으로 변경해야 합니다. 만약 위 비즈니스 로직이 다른 트랜잭션에서 작동하다 a2 포지션을 blank로 바꾼 후 에러가 발생하면 어떻게 될까요? 그렇다면 a2, a4 모두 blank를 갖게되고 폰은 어디론가 증발하게 될 것입니다. 이러한 문제를 해결하기 위해 주로 비즈니스 로직이 존재하는 Service 레이어에서 트랜잭션을 관리하게 됩니다. 트랜잭션을 완벽하게 이해하기 위해서는 dataSource가 co.. 2022. 4. 20.
[레벨 1 돌아보기] OOP에서의 정적 메서드 사용 레벨 1 레이싱 카 미션을 수행할 때 저는 아래와 같은 질문을 리뷰어에게 남겼습니다. static 메서드가 메모리를 일반 메서드보다 과하게 사용할 수 있을 것 같은데 static을 최소화하는 것이 좋을까요? 나름대로 좋은 질문이라고 생각했습니다. 정적 메서드는 객체를 생성하지 않고 클래스를 참조하여 메서드를 호출합니다. 그래서 정적 메서드는 사용하는 시점에 메서드 메모리 영역에 올라가는 것이 아니라 컴파일 시점에 정적 할당되어 GC의 대상이 되지 않아 프로그램에 끝날 때 까지 메모리에 유지됩니다. 저는 위와 같은 개념을 갖고 질문을 던졌던 것이죠. 하지만 일반 메서드 또한 메서드 메모리 영역에 할당 되기 때문에 정말 많은 정적 메서드가 존재하지 않는 한 메모리에 큰 차이는 없다고 생각합니다. 하지만 정적.. 2022. 4. 11.