Setter를 지양하는 이유

김진아·2024년 8월 29일

CS

목록 보기
12/15

Setter와 Gatter는 무엇인가?


롬복이라는 Java의 코드 작성과 유지보수를 간소화하기 위해 사용되는 라이브러리의 어노테이션이다. '@Setter'와 '@Getter'는 클래스의 필드에 대해 자동으로 setter 및 getter 메소드를 생성해준다.

기본 사용 방법

// 우리가 짠 코드
import lombok.Setter;

@Getter
@Setter
public class Person {
    private String name;
}

----------------------------------------

// Lombok이 자동으로 만들어주는 setter와 getter 메소드
// 코드상으로는 메소드의 선언이 안 보인다.
public void setName(String name) {
    this.name = name;
}

public void getName() {
    return this.name;
}



Setter를 지양해야 하는 이유


1. 정보은닉 무효화

먼저 우리는 객체 지향의 핵심요소 중 '캡슐화'에 대해서 알 필요가 있다.

객체 지향의 캡슐화
객체의 속성(Variable)을 보호하기 위해 "꼭 필요한 정보와 기능만" 외부에 오픈한다.
대부분의 멤버 변수와 메서드를 감추고 외부에 통합된 인터페이스만은 제공하여 일관된 기능을 구현 하게 한다.

어디서든지 쓸 수 있는 Lombok의 Setter메소드는 객체 지향의 원칙 중 하나인 정보은닉을 해치게 된다.

위의 기본 사용 방법의 코드에서 볼 수 있듯이, Person객체의 name필드는 private로 접근에 제한을 둠으로서 정보은닉을 지키려고 하고 있지만 public의 setter메소드 때문에 정보은닉의 효과가 사라지게 된다. 이는 또한 객체의 상태 관리 복잡성을 높임으로서 유지보수를 어렵게 만든다.

2. 의도를 알 수 없다.

정보수정의 메소드가 Setter 메소드 하나로 통일되면서, 각 상황마다 왜 이 Setter가 쓰였는지 주석을 따로 쓰지 않는한 알 길이 없다. 객체의 상태가 사용자 의도에 의해 바뀌는지 개발자의 의도에 바뀌는지, 어떤 목적으로 쓰였는지 메소드의 이름에 그 의도가 담기지 않으니 왜 쓰였는지 알 수가 없어 가독성과 유지보수성을 떨어지게 한다.

3. 의도된 동작의 누락성

만약, 객제 상태를 수정하기 전에 입력된 데이터의 검증 로직이 필요하다면 Lombok의 setter를 사용할 때 마다 매번 검증 코드를 같이 짜줘야 할 것이다. 이는 코드의 유지보수를 어렵게 만들고 객체의 상태가 유효하지 않은 상태로 남을 수 있는 위험성을 남긴다.



profile
https://develop-chick.tistory.com/ 첫번째 블로그

0개의 댓글