[TIL] 일정 관리 API Server 프로젝트 회고 (정적 팩토리 메서드 & Setter 의 위험성)

정석·2024년 8월 16일

TIL

목록 보기
20/40
post-thumbnail

개발 기간 : 2024.08.09 ~ 2024.08.15
개발 목적 : 클라이언트가 일정을 생성, 조회, 수정 및 삭제할 수 있는 RESTful API 서버를 구현한다.
🍏 레포지토리 링크

ERD

  • manager 테이블의 manager_Idschedulemanager_Id 의 외래키로 사용하는 형식이다.
  • 일정을 생성할 때 원하는 매니저 고유번호와 내용(컨텐츠), 비밀번호를 입력하면 생성되는 구조이며
    일정 삭제 및 수정 시 비밀번호를 체크하는 방식이다.
  • 일정이 생성되거나 수정 될 때 수정일과 생성일은 해당 시간으로 DB에 적재된다.

API 명세서


아쉬웠던 점

  • 멤버 변수의 private 설정을 안한 것. 익숙치 않아서 캡슐화를 제대로 하지 않았다.
  • Entity 별로 3 Layer 분리를 하지 않은 점
  • Setter 를 남발한 점

새롭게 알게된 점

▶︎ 1. 정적 팩토리 메서드

기존에 Dto 객체에 값을 맵핑할 때 Entity 객체를 매개변수로 넣어서 Dto 생성자로 만들었다. 아래와 같이

마지막에 return 되는 부분을 봤을 때 responseDtorequestDto 객체를 주입하며 새로운 Dto 객체를 생성하고 return 한다.

하지만, 해당 부분을 정적 팩토리 메서드로 구현하면 아래와 같다.

물론, 다른 Layer 내의 메서드긴 하지만 다음과 같은 특징을 볼 수 있다.

  • response 객체를 새로 생성하지 않고 리턴한다.
  • of 라고 생성자에 네이밍을 한다.

🧑🏻‍💻 그럼 과연 정적 팩토리 메서드의 이점은 뭘까?

특징에서 봤던 것처럼

첫째, 새로운 객체를 생성하지 않아 메모리상 이점이 존재한다.
둘째, 여러 생성자로 로직을 구현할 때 어떤 변수들을 활용해 생성한 객체인지 네이밍을 활용할 수 있다. (코드의 가독성 증가)

텍스트만 봤을때 이해가 가지 않을 수 있다. 한 번 정적 팩토리 메서드의 구현부를 보자.


다음과 같이 객체를 매개변수로 받았을 때 static 으로 설정된 of 라는 메서드 내에서 새로운 response 객체를 생성하고 있다. 이를 통해 static 으로 관리되면서 매번 객체를 return 할 때 response 객체를 생성하지 않고 이미 생성된 static 메서드 안에서 값만 변경되며 메모리적 이점이 존재할 것 같다..

또한 만약에, 객체를 생성할 때 필드 값이 선택적으로 몇개만 넣어서 생성하고 싶다고 생각해보자. 예를 들면 mangerIdmanagerName, managerEmail 정보가 없는 TodoResponse 를 생성하는 것처럼.

  • 네이밍한 정적 팩토리 메서드 예시
public static TodoResponse nullManagerTodoResponse(Todo entity) {
	entity.getId(),
    entity.getTodo(),
    0, // managerId
    "", // managerName
    "", // managerEmail
    entity.getCreateAt(),
    entity.getUpdateAt()
}

이렇게 네이밍을 해주면 그냥 생성자로 객체를 생성하는 것보다 직관적으로 알 수 있기에 편리할 수 있을 거 같다.

확실한 건 프로젝트 때 써 봐야 편리함을 알 거 같다!

참고한 블로그


▶︎ 2. Setter 의 위험성 ?

난 이번 프로젝트에서 엔티티, Dto 에 값을 넣을 때 Setter 를 활용했다. (Lombok 이 편리해서)

하지만, 해설 코드에서 봤을 땐 Setter 의 사용이 전혀 없었다.

이유는 다음과 같았다.

  • Entity 자체의 값을 변경할 수 있다는 건 위험하다.
  • 다른 곳에서 Setter 를 통해 값을 저장할 때 코드의 의문이 생길 수 있다.

그럼 앞으론 어떻게?!

Setter 를 사용하는 대신 값을 넣을 부분을 따로 메서드로 만들어 활용한다.
이것도 앞으로 프로젝트에서 해봐야 체감이 될 듯..

0개의 댓글