이전 팀 프로젝트에서 코드를 작성할 때 DTO와 Entity를 생성했었는데
DTO에 대해서 고민해보다가 DTO와 엔티티의 역할을 분리해서 관리하는 게 좋을 것 같다고 생각이 들었다.
수정한 내용을 살펴보자.
1. Dto에서 Entity를 생성하는 메서드 → Entity 클래스로 이동
DTO와 Entity 클래스 간 불필요한 의존성을 제거하기 위해, DTO에서 Entity를 생성하는 메서드를 Entity 클래스로 이동.
상호 의존성 제거 -> 코드 모듈화 강화
아래 코드는 ClosetDto의 일부분인데, 이 코드가 ClosetEntity의 코드로 이동하였다.
2. Setter → Builder 변경
일관성과 코드 가독성 향상을 위해 Setter 메서드 대신 Builder 패턴으로 전환.
사실 이 변경의 이유는 팀원과 코드 스타일이 달라서 발생했다.
팀원 코드는 set을 사용하고, 내 코드는 builder 패턴을 사용하고 있어가지구
일관된 코드 스타일 보장 및 동시에 코드의 의도를 더 효과적으로 전달하려 했다.
3. Data 어노테이션 제거
기존 Data 어노테이션을 지속 사용할 경우 오버스펙이 된다.
그래서 필요한 @Getter 어노테이션만 사용하도록 변경.
이 부분 설명하기 전에 @Data 어노테이션에 대해서 간단하게 알아둬야 되는게
@Data는 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor 이 어노테이션들이 함께 적용 된다.
그래서 2번(Setter 제거)이랑 이어서 설명하자면 Setter를 Builder 패턴으로 전환했었다. 즉, @Setter을 사용하지 않는다.
그리고 Entity에 생성자 또한 넘겨서 사용하는 어노테이션이 많이 없어졌다. 그래서 제거하는 방향으로 결정
Data 어노테이션이 편하긴 하지만, 진짜 몇 시간 찾아보고 알아본 결과로는 버그나 단점이 있다고 한다.
근데 그냥 적절하게 사용하는 편이 좋을 것 같다.
4. Dto의 NoArgs~, AllArgs~ 관련 어노테이션 제거
중복 방지 목적으로 DTO에서 @NoArgs~ 및 @AllArgs~ 어노테이션을 제거.
@Builder 어노테이션의 존재 하 굳이 사용할 이유 없는 어노테이션이라고 판단했다.
5. AccessLevel.PROTECTED 추가
의도하지 않은 Entity 인스턴스화를 방지하기 위해 기본 생성자에 AccessLevel.PROTECTED 추가.
사실 이 부분은 다른 사람들의 프로젝트 코드를 보다가 다들 사용하길래 궁금해서 알아보다가 추가하게 되었다.
결론적으론 @NoArgsConstructor(access = AccessLevel.PROTECTED) 라고 작성했는데, 파라미터가 없는 기본 생성자를 생성하되, 이 생성자의 접근 권한을 protected로 설정하는 기능이다.
JPA에서 기본 생성자가 있어야 되는데, NoArgs~를 사용함으로써 이를 처리한다.
그리고 원래는 기본 생성자로 객체 생성 후 Setter로 값을 주입한 코드들이 서비스 계층에 있었는데
위에서 전부 빌더 패턴으로 변경했었다.
그러면 객체 생성 - Setter 필드 값 주입으로 이어지는 과정이 builder 패턴이 되어
서비스 계층에서 무분별하게 사용할 수 있게 된 것.
그래서 AccessLevel.PROTECTED를 추가하였다.
추가로 설명하자면 일반적으로 롬복의 @NoArgsConstructor를 사용하면 기본 생성자가 public으로 생성되어 외부에서 자유롭게 접근할 수 있는데
특정 상황에서 기본 생성자를 외부에 노출하고 싶지 않은 경우에 @NoArgsConstructor(access = AccessLevel.PROTECTED)를 사용한다.
6. ClosetEntity(1) 및 ClosetEntity(2) 수정 사항
ClosetEntity(1): Private field 'id' is never assigned → id가 할당되지 않아도 자동 생성하기 때문에 문제 없음.
이 부분은 간단한 수정.
ClosetEntity(2): 이름 변경 및 공개 여부 설정이 프론트엔드에선 별개 기능으로 작동하도록 했다.
코드 작성할 때 이 두 가지 생성자를 붙여놨는데, 분리한 것(이 부분도 간단한 수정사항)
마지막으로 ClosetItemEntity에 대한 수정사항이 있는데 이건 길어질 것 같아서 나중에 계속