2024/05 6

[Template Method, Strategy, Callback Pattern] 템플릿 메서드 패턴, 전략 패턴, 콜백 패턴

개발을 하다보면 여러 클래스에서 공통적으로 사용되는 코드와 각 클래스마다 다른 구현 사항이 섞여있는 경우를 종종 볼 수 있다. 이 경우 중복되는 코드가 발생하고, 유지∙보수가 힘들어진다. 따라서 문제점을 해결하기 위해 우리는 변하는 코드와 변하지 않는 코드를 분리 할 필요가 있다. 문제는 변하는 코드가 변하지 않는 코드 중간에 섞여있다면 단순히 메서드로 추출하는 것이 어려운 경우가 있는데, 다음의 패턴들을 통해 해결할 수 있다.      Template Method Pattern    템플릿 메서드 패턴은 공통으로 사용되는(변하지 않는) 메서드를 상위 클래스에서 구현하여 템플릿화 하고, 세부 동작은(변하는 코드) 이를 사용하는 하위 클래스에서 각각 다르게 구현하는 패턴이다   AbstractTemplat..

[Entity] Domain Entity, DB Entity, Persistence Object (feat. Hexagonal)

* 김우근 님의 'Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트' 강의를 보고 작성된 글입니다. 제 견해가 섞여 들어있기 때문에 강사님의 의견과 다를 수 있습니다.      Java + SpringBoot 개발자라면 entity라는 말을 질리도록 들어봤을 것이다. 그런데 강의에서 'Entity는 JPA랑 상관이 없다' 라고 말하길래 한번 정리를 해보고자 한다.     Entity(엔티티) 먼저 우리가 흔히 말하는 엔티티는 다음의 세 가지를 뜻한다고 볼 수 있고, 강의에서는 각 개념들을 모두 구분짓고 있다 EntityDomain Entity (도메인 엔티티)SW에서 어떤 도메인이나 문제를 해결하기 위해 만들어진 모델비즈니스 로직을 들고 있고, 식별 가능하며, 일반적으로 생명 주기를 갖는다..

[Pagination] Custom Cursor-based Pagination (정렬된 커서기반 페이지네이션)

우리는 정렬된 데이터의 수가 많을 때, offset-based pagination을 사용하기보다는 cursor-based pagination을 사용한다. 이를 통해 '데이터의 변화가 있을 때 중복 데이터 노출 문제'와 'offset으로 인한 성능 이슈'를 해결할 수 있다. 하지만 실제 프로젝트에서는 단순히 column의 id를 기준으로 정렬된(대부분 최신순이겠죠?) 데이터만을 사용하는 경우는 거의 없을 것이다.예를 들어 다음과 같은 엔티티가 있다고 가정해 보자@Entity@Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)@Table(name = "product")public class Product extends BaseTimeEntity { @I..

[다형성] Interface를 통해 여러 타입 처리하기

이전글: https://kdh0518.tistory.com/entry/Reflection-%EB%A6%AC%ED%94%8C%EB%A0%89%EC%85%98-%EC%A0%9C%EB%84%A4%EB%A6%AD%EC%9C%BC%EB%A1%9C-%EC%97%AC%EB%9F%AC-%ED%83%80%EC%9E%85-%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0-feat-Lombok [Reflection] 리플렉션 & 제네릭으로 여러 타입 처리하기 (feat. Lombok)현재 개발 중인 서비스는 모바일 화면을 기준으로 개발하다 보니 cursor-based 무한스크롤 방식으로 조회하는 기능이 많다.cursor-based로 구현할 때 항상 마지막 cursor를 구한 후 클라이언트와 주고받kdh051..

[Reflection] 리플렉션 & 제네릭으로 여러 타입 처리하기 (feat. Lombok)

현재 개발 중인 서비스는 모바일 화면을 기준으로 개발하다 보니 cursor-based 무한스크롤 방식으로 조회하는 기능이 많다.cursor-based로 구현할 때 항상 마지막 cursor를 구한 후 클라이언트와 주고받아야 하는데, 이를 구하는 메서드는 많은 곳에서 사용된다.  예를 들어 다음 메서드를 보자위의 메서드는 List로 형식으로 된 content를 받아서 마지막 값에서 userShortsId를 추출해 낸다. 하지만 서비스에는 수많은 조회 기능이 존재하고, content에 FeedShortsOutDto가 아닌 다른 Dto가 들어오는 경우도 생기게 되었다. 물론 모든 경우마다 메서드를 만들어서 사용해도 되지만, 다른 Dto에도 공통적으로 userShortsId를 cursor로 사용하고 있었기에 중복..

[Proxy Pattern] 프록시 패턴

Proxy  영어로 Proxy는 '대리', '대리인' 이라는 뜻을 가지고 있다. 뜻 그대로 프록시 패턴이란, 원본 객체에 직접적으로 접근 하는 것이 아니라 어떤 '대리자'를 통해서 간접적으로 원본 객체를 사용하는 것을 말한다.  그림을 통해 자세히 알아보자 인터페이스를 구현한 'Origin Object'와 'Proxy Object'가 있다. 'Proxy Object'는 'Origin Object'를 컴포지션하여 멤버 변수로 사용하고있다. 이때 Client에서 요청이 온다면 다음처럼 작동 할 것이다.Client에서 Request를 보냄Controller를 거친 뒤, 'Origin Object'가 아닌 'Proxy Object'를 호출'Proxy Object'는 method A를 구현하고, 기타 작업을 수행..