Java 7

코드 복잡도 줄이기 (Cyclomatic Complexity, NPath Complexity)

2023년 8월 3일 추가: 이 내용을 포함한 카카오 테크밋에서 발표한 영상이 올라왔습니다. 이번 포스팅도 어떤 백엔드 서비스의 코드를 리팩터링한 내용을 정리하는 것으로, 이번에는 코드 복잡도 줄인 리팩터링에 대한 내용을 정리한다. 이전에 포스팅했던 '가변 Context 클래스는 신중하게 사용하자'와 '고차 함수로 의존성 줄이기'로 코드의 의존성 문제들이 많이 정리된 상태라서 복잡도 줄이기를 진행할 수 있었다. 아래는 어떤 백엔드 서비스 코드의 리팩터링 전과 후의 코드 복잡도 Cyclomatic Complexity와 NPath Complexity의 수치 변화다. 많이 줄어든 것을 볼 수 있다. 실제로 작업했던 코드를 기반으로 소개할 수는 없으니, 일반화해서 조금은 억지스러운 예제로 만들어 내용을 정리한다..

Dev 2022.12.25

고차 함수로 의존성 줄이기

2023년 8월 3일 추가: 이 내용을 포함한 카카오 테크밋에서 발표한 영상이 올라왔습니다. 스프링을 사용한 프로젝트에서 종종 보이는 어노테이션에 사용한 의존성 주입의 남용과 오랜 세월의 흐름으로 의도치 않게 서비스 간의 의존성 그래프가 복잡하게 강결합으로 묶이면서 코드를 읽기도 어렵고 단위 테스트를 구성하기도 어려운 상황이 생긴다. 아래는 어떤 백엔드 서비스의 의존성 그래프다. 순환 종속성이 포함된 복잡한 왼쪽의 의존성 그래프를 오른쪽의 단순한 의존성 그래프로 리팩터링하여 라이브 서비스에 반영하였다. 이번 글은 오랜 세월의 흐름으로 서비스 의존성 그래프가 복잡해진 라이브 서비스를 리팩터링한 내용을 일반화하여 작은 예제로 만들어서 정리한다. 이 글을 읽는데 필요한 배경지식으로 자바의 함수형 인터페이스를 ..

Dev 2022.09.22

자바 직렬화(Java Object Serialization)에 유연성 더하기

자바 객체를 영속화하는 방법의 하나로 자바 직렬화를 사용할 수 있다. 단순하게는 Serializable 인터페이스를 구현하거나 더 확장성 있는 방법으로는 Externalizable 인터페이스를 구현하는 것을 선택할 수 있고, 자바 직렬화에 종속되지 않는 다른 방법을 선택할 수도 있다. 일단, Serializable 인터페이스를 구현한 클래스의 인스턴스가 외부 저장소에 영속화되면 호환성을 유지하면서 해당 클래스의 필드를 수정하기는 어렵다. (https://docs.oracle.com/en/java/javase/11/docs/specs/serialization/version.html) Serializable 대신 Externalizable 인터페이스를 구현하면 객체 직렬화 단계에서 객체 스트림에 읽고 쓰는 ..

Dev 2021.12.11

serialVersionUID가 없는 Serializable Class를 수정해야 할 때

자바로 개발된 프로젝트를 유지 보수하다 보면 Object Serialization, Deserialization이 사용된 코드를 흔하게 볼 수 있다. 간단하게 Serializable 인터페이스를 구현했거나 Externalizable 인터페이스를 구현해서 JSON 등의 다른 포맷으로 영속화를 시켰는지는 여기서 중요하지 않다. serialVersionUID를 명시적으로 정의하지 않고 생략했다면, 모두 동일한 문제를 가지고 있다. 문제는 아래와 같은 상황에서 발생한다. A 객체를 직렬화하여 Redis나 DB 등 외부에 저장하고, 저장된 값을 A 객체로 역직렬화하여 사용하고 있다. 어느 날 A 객체에 필드를 추가하거나 삭제하는 수정을 한다. 새로 빌드한 서비스에서 수정된 A 객체로 외부에 저장된 값을 역직렬화하..

Dev 2020.04.23

IntelliJ 의 JShell Console 을 활용하자

최근에 Java 를 실무에 사용하면서 JShell 이 있어서 참 다행이라고 생각하고 있다. IntelliJ 가 JShell Console 이라는 기능으로 툴 안에서 JShell 을 연동해주고 있어서 더 편리하게 사용하고 있는데 이번 글에서는 JShell 에 대한 간단한 소개와 유용함을 알아보자. 이 글은 macOS 를 기준으로 하며 다음의 내용을 다룬다. JShell 에 대한 간단한 소개Java 8, 9, 10 를 손쉽게 전환하면서 사용하는 방법IntelliJ 의 JShell Console 사용하기IntelliJ 의 JShell Console 에서 사용자 클래스 사용하기 JShell 에 대한 간단한 소개JShell 은 node.js 의 shell 이나 scala 의 shell 처럼 코드를 바로바로 실행하..

Dev 2018.04.30

JAVA 8 에서 케이크 패턴(Cake Pattern)을 사용해보자

지난 글에서 의존성 주입(Dependency Injection)에 대한 이야기를 했었다. 이번 글에서는 다른 방식의 의존성 주입인 케이크 패턴을 소개한다. 스칼라의 케이크 패턴에 대한 자세한 내용은 여기를 참고 바란다.케이크 패턴스칼라의 케이크 패턴을 자바에서 사용해보자. 케이크 패턴은 의존성 주입의 한 방법이다. 자바 8에서는 인터페이스가 구현 코드를 담은 디폴트 메소드를 가질 수 있게 되었다. 이 디폴트 메소드를 이용하면 스칼라의 trait 와 비슷해진다. 비록 trait 의 셀프 타입을 사용할 수는 없지만, 어차피 자바는 스칼라처럼 with 를 사용하여 객체 생성 단계에 와이어링을 할 수 없으니 상관없다.공통 구성로그 기록을 담당하는 Logger, 설정 로딩을 담당하는 Configuration 가 ..

Dev 2018.04.01

Setting ZeroMQ for MacOS

Mac 에서 개발 환경을 설정하던 중에 ZeroMQ 에 종속성을 가진 프레임워크를 사용할 일이 생겼다.이거 하나 때문에 윈도를 다시 개발 환경으로 사용하고 싶지는 않아서 ZeroMQ 를 Mac 에서 사용할 수 있도록 설정하는 방법을 찾았고 아래에 정리했다. ------------------------------------------------------------------------------------------1. brew 설치https://brew.sh/index_ko.html 2. jzmq 빌드에 필요한 툴들 설치brew install autoconfbrew install automakebrew install lib toolbrew install pkg-configbrew install zero..

Dev 2018.01.12
반응형