Back End/Spring Data JPA
[Spring JPA] Setter를 사용하지 않는다.
DevPing9_
2021. 11. 30. 22:18
# Setter 사용을 지양하는 이유
- 의도가 무엇인지 파악이 어렵다. (생성인지, 업데이트인지)
- 객체의 일관성을 유지하기 어렵다. (특정 메서드가 아닌 모든영역에서 접근이 가능하다)
# Lombok.config 에서 특정 Annotation 제한하기
lombok.setter.flagUsage=error // @Setter 사용시 컴파일에러
lombok.data.flagUsage=error // @Data 사용시 컴파일에러
# 예시 코드
1. DTO
package com.bookmarkmanager.bookmarkmanager.dto;
import com.bookmarkmanager.bookmarkmanager.db.entity.User;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class UserDto {
@Getter
@AllArgsConstructor
@Builder
public static class SignUpReq{
private String userId;
private String userPw;
private String userEmail;
public User toEntity(){
return User.builder()
.userId(this.userId)
.userPw(this.userPw)
.userEmail(this.userEmail)
.build();
}
}
@Getter
@AllArgsConstructor
@Builder
public static class LoginReq{
private String id;
private String pw;
}
@Getter
@AllArgsConstructor
@Builder
public static class UpdateReq{
private String pw;
private String email;
}
}
2. Entity
package com.bookmarkmanager.bookmarkmanager.db.entity;
import javax.persistence.Entity;
import com.bookmarkmanager.bookmarkmanager.db.repository.UserRepository;
import com.bookmarkmanager.bookmarkmanager.dto.UserDto;
import com.bookmarkmanager.bookmarkmanager.dto.UserDto.SignUpReq;
import com.bookmarkmanager.bookmarkmanager.dto.UserDto.UpdateReq;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED) // new User() 막음
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class User extends DbEntity{
private String userId;
private String userPw;
private String userEmail;
@Builder
public User(String userId, String userPw, String userEmail){
this.userId= userId;
this.userPw = userPw;
this.userEmail = userEmail;
}
public void userUpdate(String pw, String email){
this.userPw = pw;
this.userEmail = email;
}
}
3. Service
package com.bookmarkmanager.bookmarkmanager.db.service;
import java.util.List;
import com.bookmarkmanager.bookmarkmanager.db.entity.User;
import com.bookmarkmanager.bookmarkmanager.db.repository.UserRepository;
import com.bookmarkmanager.bookmarkmanager.dto.UserDto.UpdateReq;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
public void update(String userId, UpdateReq req){
List<User> user = userRepository.findByUserId(userId);
if(!user.isEmpty()){
user.get(0).userUpdate(req.getPw(), req.getEmail());
userRepository.save(user.get(0));
}
}
}
# Reference
Spring-Jpa Best Practices Step-06 - Setter 사용하지 않기 - Yun Blog | 기술 블로그
Spring-Jpa Best Practices Step-06 - Setter 사용하지 않기 - Yun Blog | 기술 블로그
cheese10yun.github.io
728x90