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