-
[Spring JPA] Setter를 사용하지 않는다.Back End/Spring Data JPA 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
728x90'Back End > Spring Data JPA' 카테고리의 다른 글
[Spring JPA] 왜 테스트코드와 실제 어플리케이션코드가 실행이 다르게 될까? (0) 2021.12.24 [Spring JPA] JPA의 사실과 오해 (feat. NHN Cloud) (0) 2021.12.23 [Spring JPA] FetchType 이란? (EAGER, LAZY Fetch) (0) 2021.11.02 [Spring JPA] Dirty Check 는 무엇이고, 그로 인한 성능적인 손해는 무엇일까? (0) 2021.11.02 [Spring JPA] 쿼리메소드, JPQL, NativeQuery (@Query) (0) 2021.11.01