Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20240713 Entity에 @Setter어노테이션을 사용하지 않는 이유? 본문

개발Article

[TIL]20240713 Entity에 @Setter어노테이션을 사용하지 않는 이유?

최밤빵 2024. 7. 14. 01:03

기술매니저님의 코드리뷰를 들으면 엔티티에 @Setter어노테이션을 쓰지말라고 하시고선 이유는 절!대! 안알려주신다. 직접 알아보라고 하시지... 진짜 명확한 이유를 듣고싶은데, 그래도 이런거 찾아보는게 공부니까.. 근데 매니저님.. 진짜 왜 안 알려주시는거에요....? 

엔티티 클래스는 데이터베이스와의 매핑을 통해 데이터를 영구적으로 저장하고 관리하는 중요한 역할을 하기때문에 설계 시 주의할 점이 많다. 왜 @Setter 어노테이션을 사용하는 것이 좋지않은 이유는 뭘까? 

 

▶ @Setter 어노테이션이란?

@Setter 어노테이션은 Lombok 라이브러리가 제공하는 기능 중 하나로, 클래스의 필드에 대한 setter 메서드를 자동으로 생성해준다. 이 어노테이션을 사용하면 코드가 간결해지고, 수동으로 메서드를 작성하는 번거로움을 줄일 수 있다. 하지만 엔티티 클래스에 @Setter를 남용하면 여러 문제가 발생할 수 있다. ← 어노테이션 하나가 남용이야...? 

 

▶ 엔티티에서 @Setter를 지양해야하는 이유

1. 엔티티의 무분별한 변경 가능성 :

엔티티 클래스에 @Setter를 사용하면 모든 필드에 대한 setter 메서드가 자동으로 생성되기 때문에, 어디서든 엔티티의 상태를 변경할 수 있게 된다. 이런 방법은 객체의 무결성을 해치고, 의도치 않은 상태 변화로 이어질 수 있기때문에 유지보수성과 안정성을 떨어뜨린다.

2. 엔티티의 불변성(Immutability) 유지 :

엔티티는 데이터베이스의 상태를 반영하는 중요한 객체이기 때문에, 가능한 불변(immutable)하게 유지하는 것이 좋다. 불변성은 객체가 생성된 이후 내부 상태가 변하지 않음을 보장하면서, 버그를 줄이고 예측 가능한 코드를 작성하는 데 도움을 준다. @Setter를 사용하면 불변성을 유지할 수 없게 된다.

3. 명확한 의도를 가진 메서드 설계 필요성 :

엔티티의 상태 변경은 비즈니스 로직에 따라 신중하게 이루어져야 한다. 예를 들어, 메모 애플리케이션에서 메모의 내용을 수정할 때는 updateContents()와 같은 명확한 의도를 가진 메서드를 통해 수정해야 한다. @Setter를 사용하면 명확성이 사라지고, 코드의 가독성도 떨어지게 된다.

4. 캡슐화 원칙 위반:

엔티티의 필드가 외부에서 무분별하게 수정될 수 있다는 것은 캡슐화(Encapsulation) 원칙을 위반하는 것이다. 캡슐화는 객체지향 설계에서 중요한 원칙으로, 객체의 내부 상태를 외부에서 직접 수정하지 못하도록 보호하는 것을 의미한다. @Setter는 이러한 원칙을 쉽게 깨뜨리게 된다.

5. 일관성 있는 비즈니스 로직 유지:

엔티티의 필드가 무분별하게 수정될 수 있으면, 일관된 비즈니스 로직을 유지하기 어려워진다. 이런 문제는데이터 불일치 문제를 일으킬 수 있고, 장기적으로 애플리케이션의 유지보수성을 크게 저하시킨다.

 

▶ 올바른 엔티티 설계 방법

엔티티는 다음과 같은 방법으로 설계하는 것이 좋다

생성자 또는 정적 팩토리 메서드 사용:

객체 생성 시 필수 필드를 초기화헤서 불완전한 상태의 객체가 생성되지 않도록 한다.

명확한 도메인 메서드 정의:

updateContents(), changePassword()와 같은 비즈니스 로직에 맞는 메서드를 정의해서 엔티티의 상태를 변경하도록 한다.

필드의 불변성 유지:

되도록이면 엔티티의 필드를 final로 선언하고, 필요한 경우 값 변경 로직을 메서드로 캡슐화하여 불변성을 유지한다.

 

▶ 정리 

엔티티 클래스에 @Setter 어노테이션을 사용하지 않고, 명확한 비즈니스 로직에 따른 메서드를 설계해서 코드의 안전성과 유지보수성을 높이는 데 중점을 두는 것이 좋다. 엔티티는 애플리케이션의 핵심 데이터를 다루는 중요한 객체이기 때문에, 설계 시 신중함이 필요하다. 객체의 무결성을 유지하면서 일관된 비즈니스 로직을 구현하기 위해서는 엔티티 설계 원칙을 철저히 준수하는게 좋다! 

'개발Article' 카테고리의 다른 글

[TIL]20240715 제네릭의 와일드카드 <?>  (0) 2024.07.15
[WIL]20240714  (0) 2024.07.14
[TIL]20240712 Entity  (0) 2024.07.12
[TIL]20240711 Dto 사용의 중요성  (0) 2024.07.12
[TIL]20240710 Controller를 이해해보자!  (0) 2024.07.12