Java에서 Jpa를 쓰다보면, 항상 select를 선으로 진행하게 되는 경우가 많다.
예를 들어, name과 age를 입력했는데, name이 unique하다면,
DB에서 name으로 select를 해보고, 있으면 setAge()
를 통해서 update를 진행해야 하고,
없으면 해당 Entity를 새로 생성해서 insert를 해야한다.
그래서 아래와 같은 로직을 사용하는 경우가 많다.
1 2 3 4 5 6 7 8 9 10 11 12 |
public void putSomeEntity(String name, int age) { SomeEntity someEntity = someEntityRepository.findByName(name); if (someEntity == null) { someEntity = new SomeEntity(); someEntity.setName(name); } someEntity.setAge(age); someEntityRepository.save(someEntity); } |
매번 null check하는 것은 불필요한데, 은근히 많이 사용되는 패턴이다.
그래서 아래처럼 Utility class를 구현했다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
package kr.co.freeism.util; import com.google.common.base.Preconditions; import lombok.AccessLevel; import lombok.NoArgsConstructor; import javax.persistence.Entity; /** * @author freeism * @since 2018. 6. 2. */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class EntityUtil { /** * obj가 null인지 판단해서 * null이면 명시한 class의 default 생성자를 호출한 객체를 리턴하고 * null이 아닌 경우에는 입력받은 obj를 그대로 리턴함 * * @param obj nullcheck 할 대상 객체, @Entity 어노테이션이 필요함. * @param clazz null인 경우에 반환할 디폴트 객체의 타입 * @return obj != null ? obj : new obj() * @throws NullPointerException If clazz is null. * @throws IllegalArgumentException If @Entity annotaion is missing. * @throws IllegalArgumentException If clazz.newInstance() throws Exception. */ public static <T> T defaultEntity(T obj, Class<T> clazz) { Preconditions.checkNotNull(clazz, "clazz must be defined."); Preconditions.checkArgument(clazz.isAnnotationPresent(Entity.class), "clazz must be Entity annotated class."); try { return obj == null ? clazz.newInstance() : obj; } catch (IllegalAccessException | InstantiationException e) { throw new IllegalArgumentException("clazz must have default constructor."); } } } |
1 2 3 4 5 6 7 |
public void putSomeEntity(String name, int age) { SomeEntity someEntity = EntityUtil.defaultEntity(someEntityRepository.findByName(name), SomeEntity.class); someEntity.setAge(age); someEntityRepository.save(someEntity); } |