Jinnie devlog

Setter 사용을 지양해야 하는 이유 본문

Spring

Setter 사용을 지양해야 하는 이유

Jinnnie 2023. 1. 19. 16:42

Setter 사용을 지양해야 한다. 이유는 여러가지가 있지만, 가장 큰 두 가지 이유는

 

1. Setter를 사용하면 값을 변경한 의도를 파악하기 어렵다.

public Member updateMember(long id) {
    final Member member = findById(id);
    member.setFistName("value");
    member.setLastName("value");
    return member;
}

 

단순히 이렇게 setter로 값을 변경했을 때, 시간이 지나고 다시 위 코드를 봤을 때는 값을 왜 변경하게 되었는지 알기위해 코드를 역추적해서  찾아가야 한다.

 

2. 객체의 일관성을 유지하기 어렵다.

회원의 이름을 변경하는 메서드를 만들었다고 가정했을 때 무작정 setter로 값을 변경하게 되면, 회원의 이름을 다른 곳에서 변경할 수 있게 되어 문제가 발생한다.

 

Setter의 대안

- setter를 열어두지 않고 의미있는 메서드를 만들어 사용해야한다.

- setName, setAge 등은 필드의 상태를 목적없이 set하는 것이다.

- 이것을 updateUserInfo(String name, int age) 와 같이 메소드로 변경해야 한다.

- 도메인 모델 패턴에서는 이런 메서드를 도메인에 구현하여 응집도 있게 개발한다.

- 서비스에서는 이런 도메인의 비즈니스 메서드를 조립하고 트랜잭션 단위로 잘 묶는 것이 포인트이다.

 

 

Setter를 사용하지 않는 코드

@Transactional
public PostResponseDto update(PostRequestDto requestDto) {
    Post post = postRepository.findById(requestDto.getId())
        .orElseThrow(() -> new IllegalArgumentException("해당 게시글이 없습니다. id = " + requestDto.getId()));

    return post.update(requestDto.getTitle(), requestDto.getContent());
}

'Spring' 카테고리의 다른 글

Spring의 @EventListener  (0) 2023.01.30
Entity와 DTO 분리하기  (0) 2023.01.25
PasswordEncoder, BcryptPasswordEncoder  (0) 2023.01.19
Spring Security : Web Ignore  (0) 2023.01.19
@EqualsAndHashCode, equals, hashCode  (0) 2023.01.18