해결된 질문
작성
·
251
1
package com.group.libraryapp.domain.user;
import com.group.libraryapp.domain.user.loanhistory.UserLoanHistory;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id = null;
@Column(nullable = false, length = 20, name = "name")
private String name;
private Integer age;
// ManyToOne의 관계이기 때문에 List 사용
@OneToMany(mappedBy = "user") // mappedBy는 연관관계의 주인이 아닌 쪽에 붙는다.
private List<UserLoanHistory> userLoanHistories = new ArrayList<>();
protected User() {
}
public User(String name, Integer age) {
if (name == null || name.isBlank()) {
throw new IllegalArgumentException(String.format("잘못된 name(%s)이 들어왔습니다.", name));
}
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Long getId() {
return id;
}
public void updateName(String name) {
this.name = name;
}
}
궁금증은 간단합니다. updateName과 setName의 차이점이 무엇인지 궁금합니다.
updateName 또한 setName 처럼 User 객체의 name 프로퍼티를 변경해주기 위한 메서드로 보입니다.
이름만 다를 뿐 형태가 똑같은데 굳이 updateName 이란 메서드를 만드는 이유가 궁금합니다.
updateAPI에 맞춰서 통일성을 주기 위해 updateName 메서드를 만든 것인지, update의 요구 조건에 따라 updateName이 변경될 가능성이 있기 때문에 확장성 때문에 만든건지 아니면 어떠한 이점이 있는 것인지 등등 그 목적이 알고 싶습니다.
답변 1
0
안녕하세요, ym Kim님~!! 정~~말 좋은 질문 감사드립니다!
해당 내용은 아래 유튜브 채널에 매우 자세한 설명을 올려두었는데요!!
내용을 간단히 요약해보자면
setter는 도메인 지식을 충분히 표현하지 못한다.
setter는 응집성을 떨어트린다.
setter는 신규 요구사항을 구현하거나 코드를 추적할 때에 불리하다.
(다른 이야기) 기술적인 요구사항은 비교적 명확한 반면, Business를 표현하는 도메인은 필드의 이름도 바뀌고~ 필드가 바뀌는 이유도 바뀌고, 함께 변경되어야 하는 조건도 계속해서 바뀝니다.
입니다!! 답변이 도움이 되었으면 좋겠습니다 ㅎㅎ
관련해서 더 궁금한 부분이 생기시면 추가로 질문 편하게 남겨주세요~!! 🙏