Getter, Setter 지양하기

bird.j·2021년 4월 22일
2

SpringBoot

목록 보기
17/22

📌 객체의 상태가 변경되는 것은 객체 스스로의 행동에 의해서야 한다.

이렇게 설계될 때 객체는 자율적인 객체가 되고 외부의 영향을 받지 않음으로써 느슨한 결합과 유연한 협력을 이룰 수 있다.

getter, setter는 자신의 상태정보를 외부에 노출하고 이것은 외부의 영향으로 상태정보가 변할 수 있는 가능성을 열어두게된다. 한 객체의 변화가 여러 객체에게 영향을 주는 이러한 코드가 많아질수록 훗날 유지보수가 어려워질 것이다.

💡 Getter 지양하기


getter는 단순히 값을 뱉어내는 역할을 할 뿐 객체의 상태값을 변경할 수 있는 것도 아닌데 굳이 왜 그렇게 하는것일까?

🎈 Getter를 지양해야하는 이유

  • getter를 남발하는 습관을 막을 수 있다.
    객체는 독립적이어야하는데 getter를 통한 로직처리를 하는 메소드가 많아질수록 getter에 대한 의존성은 매우 높아질 것이다.

  • getter메소드만으로 외부에서 객체의 상태를 변경하지는 못하지만 그 결과값이 객체의 상태를 변경시키는데에 사용될 수 있다.

🎈 Getter 대신에 쓸 수 있는 방법

  • getter를 통해 얻은 상태값으로 하려고 했던 행동을 그 상태값을 가진 객체가 하도록 행동의 주체를 옮긴다.

    • 예를 들어 값을 비교할 때 get을 사용해 객체의 변수를 꺼내와서 비교했다면 isSame()과 같은 메소드를 객체에 위치시켜 비교하고자 하는 값을 메소드의 파라미터로 넘겨 객체가 판별하도록 하는 것이다.


💡 Setter 지양하기


🎈 Setter를 지양해야하는 이유

  • 위에도 언급했듯이, 객체는 독립적이어야하는데 setter를 통한 로직처리를 하는 메소드가 많아질수록 setter에 대한 의존성은 매우 높아질 것이다.

  • 변경되지 않는 인스턴스에 대해서도 setter로 접근이 가능해져 객체의 일관성, 안정성이 보장받기 힘들다. (setter가 가능하다는 것은 불변하지 않다는 것이다)

🎈 Setter 대신에 쓸 수 있는 방법

  • 객체를 생성하는 경우 생성자를 통해 데이터를 받아서 처리하기
    User user = new User(team, username, password);
    User 도메인에서는 다음과 같다.
  public User(String team, String username, int password){
      this.team = team;
      this.username = username;
      this.password = password;
  }
  • builder패턴을 이용하기
User newUser = User.builder()
                        .username(user.getUsername)
                        .password(passwordEncoder.encode(user.getPassword)
                        .name(user.getName).build();

참고 | getter메소드 사용을 지양하자
참고 | lombok 잘 사용하기잘 사용하기
참고 | 도메인 모델에 set 메소드 사용하지 않기

공부한 이후로 setter는 안쓰고 있는데 getter를 안쓰는 것은 어려운 것 같다..ㅠ

0개의 댓글