Spring/프로젝트 관련
[엔티티파일 작성]엔티티 파일 작성 시 유의사항 및 참고
김긍수
2021. 4. 10. 04:55
공부하면서 계속 추가해나갈 예정입니다.
1. 가급적 Setter는 엔티티에 없어야한다.
2. 만약 세터없이 필드값을 바꾸는게 꼭 필요하다면 메소드를 제공하는 것이 더 좋은 방법이다.
@Entity
@Getter @Setter // 가급적 Setter는 엔티티에 없어야하지만 예제이므로 작성 (실무에서는 꼭 필요한 곳에서만)
public class Member {
@Id
@GeneratedValue
private Long id;
private String username;
//private로 막으면, 프록싱 막힐 수 있는 문제가 있음 | JPA 기본생성자필수
protected Member() {
}
public Member(String username) {
this.username = username;
}
//만약 세터없이 이름 바꾸는게 꼭 필요하다면 메소드를 제공하는 것이 더 좋은 방법
public void changeUsername(String username) {
this.username = username;
}
}
3. List<?> 타입 변수 선언 시 초기화까지 하라.
private List<Member> members = new ArrayList<>();
4. JPA는 기본생성자가 필수이다. 접근제어자도 protected까지만 허용된다.
@NoArgsConstructor(access = AccessLevel.PROTECTED) 어노테이션을 이용할 수 있다.
5. @ToString(of = {"id", "username", "age"})
객체를 찍으면 값을 확인할 수 있다. 하지만 이 곳에 연관관계를 맺은 필드를 추가한다면 출력할때도 연관관계를 타고 들어가기때문에 무한루프 가능성이 있다.
6. 연관관계를 셋팅하는 메소드를 작성해주어야한다.
public class Member {
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "team_id")
private Team team;
...
public Member(String username, int age, Team team) {
this.username = username;
this.age = age;
changeTeam(team);
}
//Member에서 Team을 변경
public void changeTeam(Team team) {
this.team = team;
team.getMembers().add(this); //Team에 있는 Member도 셋팅
}
}
7. @XToOne 관계는 무조건 LAZY 옵션을 설정해주어야한다. (지연로딩)
지연로딩 : 연관관계를 맺은 객체는 프록시객체(가짜객체)로 가지고 있다가 실제 값을 사용하거나 조회할 때 DB에서 데이터를 가져온다. (쿼리)