Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- JPA
- lombok
- EffectiveJava
- effective java
- BFS
- EntityGraph
- 이펙티브자바
- spring
- 자바
- interceptor
- TDD
- collapse
- JVM
- 알고리즘
- thymeleaf
- Spring Security
- AOP
- 배낭문제
- cache
- 파이썬
- 캐시
- Java
- Transactional
- 클린아키텍처
- Garbage Collection
- 코딩테스트
- 타임리프
- 멱등성
- @Transactional
- 동시성처리
Archives
- Today
- Total
Jinnie devlog
Setter 사용을 지양해야 하는 이유 본문
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 |