JAVA

2022-12-26
이번 포스팅도 어떤 백엔드 서비스의 코드를 리팩터링한 내용을 정리하는 것으로, 이번에는 코드 복잡도 줄인 리팩터링에 대한 내용을 정리한다. 이전에 포스팅했던 ' 가변 Context 클래스는 신중하게 사용하자 '와 ' 고차 함수로 의존성 줄이기 '로 코드의 의존성 문제들이 많이 정리된 상태라서 복잡도 줄이기를 진행할 수 있었다. 아래는 어떤 백엔드 서비스 코드의 리팩터링 전과 후의 코드 복잡도 Cyclomatic Complexity와 NPath Complexity의 수치 변화다. 많이 줄어든 것을 볼 수 있다....
2022-09-22
스프링을 사용한 프로젝트에서 종종 보이는 어노테이션에 사용한 의존성 주입의 남용과 오랜 세월의 흐름으로 의도치 않게 서비스 간의 의존성 그래프가 복잡하게 강결합으로 묶이면서 코드를 읽기도 어렵고 단위 테스트를 구성하기도 어려운 상황이 생긴다. 아래는 어떤 백엔드 서비스의 의존성 그래프다. 순환 종속성이 포함된 복잡한 왼쪽의 의존성 그래프를 오른쪽의 단순한 의존성 그래프로 리팩터링하여 라이브 서비스에 반영하였다. 이번 글은 오랜 세월의 흐름으로 서비스 의존성 그래프가 복잡해진 라이브 서비스를 리팩터링한 내용을 일반화하여 작은 예제로 만들어서 정리한다....
2021-12-13
자바 객체를 영속화하는 방법의 하나로 자바 직렬화를 사용할 수 있다. 단순하게는 Serializable 인터페이스를 구현하거나 더 확장성 있는 방법으로는 Externalizable 인터페이스를 구현하는 것을 선택할 수 있고, 자바 직렬화에 종속되지 않는 다른 방법을 선택할 수도 있다. 일단, Serializable 인터페이스를 구현한 클래스의 인스턴스가 외부 저장소에 영속화되면 호환성을 유지하면서 해당 클래스의 필드를 수정하기는 어렵다. ( https://docs.oracle.com/en/java/javase/11/docs/specs/serialization/version.html...
2020-04-23
자바로 개발된 프로젝트를 유지 보수하다 보면 Object Serialization, Deserialization이 사용된 코드를 흔하게 볼 수 있다. 간단하게 Serializable 인터페이스를 구현했거나 Externalizable 인터페이스를 구현해서 JSON 등의 다른 포맷으로 영속화를 시켰는지는 여기서 중요하지 않다. serialVersionUID를 명시적으로 정의하지 않고 생략했다면, 모두 동일한 문제를 가지고 있다.   문제는 아래와 같은 상황에서 발생한다. A 객체를 직렬화하여 Redis나 DB 등 외부에 저장하고, 저장된 값을 A 객체로 역직렬화하여 사용하고 있다....
2019-11-05
쇼핑몰의 주문 상세 화면은 일반적으로 주문 내역과 배송 정보, 결제 정보 등을 보여준다. 이럴 때 하나의 데이터베이스를 사용하는 모놀리틱 아키텍처 Monolithic Architecture 에서는 여러 테이블을 조인하면 되지만 다수의 서로 다른 데이터베이스를 사용하는 마이크로서비스 아키텍처 Microservice Architecture 에서는 여러 마이크로서비스의 데이터베이스에 정보가 들어 있기 때문에 데이터베이스의 물리적 조인이 어렵다. 따라서 마이크로서비스 아키텍처에서 주문 상세 화면은 여러 API를 호출하여 화면을 구성하기 마련이다. [caption id="attachment_24473" align="alignnone" width="889"]...
2019-10-22
원문제목 : Introducing Javalin: a Lightweight Web Framework for Java and Kotlin 원문링크 : https://www.infoq.com/news/2019/07/javalin/ 독자분들의 이해를 돕기 위해 역자의 설명을 많이 추가하여 원본 글의 의도와는 다소 다를 수가 있으니 원본글도 같이 참고해주세요. 본문의 예제 코드 대부분은 Java10+ 문법을 기반으로 작성되었으나, 몇 개 예제는 Kotlin으로 작성되었습니다. Javalin은 자바와 코틀린을 위한 경량 웹 프레임워크입니다. Javalin은 기본적으로 웹소켓, HTTP2 그리고 비동기 요청을 지원하며 구조가 심플하고 블로킹 모델로 설계되었습니다. 처음에는 SparkJava 프레임워크를 기반으로 만들어졌지만, 자바스크립트 프레임워크인...
2019-06-18
JPA Java Persistence API 로 애그리게잇 을 구현할 때면 흔히 루트 엔터티(전역 식별성을 지니며 주체로 쓰이는 엔터티)에 연관 엔터티 컬렉션을 매핑한다. 때때로 루트 엔터티는 연관 엔터티 컬렉션의 카운트를 제공해야 하는 경우가 있는데 여기서 성능 문제가 발생할 수 있다. 이 글은 연관 엔터티 컬렉션의 카운트를 구할 때 발생할 수 있는 성능 문제를 알아보고 이를 개선해 가는 과정을 소개한다. 부서 목록을 보여주는 화면 부서 목록과 함께 직원 수와 프로젝트 수를 보여주는 화면을 만든다고 가정해 보자....
2019-03-18
이 글은 도메인 주도 설계 Domain-Driven Design (이하 DDD)에서 말하는 값 객체 Value Object 가 무엇인지 알아보고 마이크로서비스 환경에서 값 객체를 활용하는 법을 다룬다. 값 객체란 무엇인가? 전자 상거래 사이트에서 상품을 받을 주소(배송지)를 입력하고 주문한다고 생각해 보자. 시스템에서 배송지를 임의로 수정한다면 상품은 정상적으로 배송되지 못할 것이다. 따라서 시스템은 배송지를 바뀌지 않게 다뤄야 한다. 배송지를 바뀌지 않게 클래스로 표현하면 아래와 같다. 바뀌지 않는다는 것은 생성 이후에는 변경되지 않음을 의미한다. 이를 구현하기 위해 생성자로만 객체를 생성할 수 있으며 속성을 변경하는 Setter가 없다....
2019-01-22
필자는 도메인 주도 설계 Domain-Driven Design (이하 DDD) 빌딩 블록 Building blocks[1] 으로 애플리케이션을 구현하면서 엔티티 ENTITY[2] 마다 리파지토리 REPOSITORY 를 만드는 것을 자주 보았는데 자세히 살펴보면 여러 엔티티를 묶어서 하나처럼 사용하는 경우가 대부분이었다. DDD에서는 이러한 연관 객체의 묶음을 애그리게잇 AGGREGATE 이라고 정의하고 애그리게잇에 포함된 특정 엔티티를 루트 Root 엔티티라고 부른다. 그리고 리파지토리를 만들 때 애그리게잇 루트 엔티티에 대해서만 리파지토리를 제공하라...
2018-12-04
같은 코드의 반복은 중복을 낳는다. 그리고 중복은 유지 보수를 어렵게 만든다. 따라서 반복을 최소화해야 한다. 이 글은 엑셀 파일 데이터를 가공하여 데이터베이스로 옮기거나 혹은 다른 파일 포맷으로 변경하려 할 때 나타날 수 있는 반복 코드와 템플릿/콜백 Template/Callback 패턴을 사용하여 반복 코드를 줄여가는 과정을 소개한다. 반복 코드 엑셀 파일을 읽어 오는 코드를 작성한다고 가정해 보자. Java로 엑셀 파일을 다룰 때 Apache POI (이하 POI)를 많이 사용한다. POI는 마이크로소프트 오피스 포맷(Word, PowerPoint, Excel) 문서를 읽고 쓸 수 있는 Java 라이브러리이다....
더보기