ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [돌다리 두들기기] Builder 패턴
    개발/JPA 2024. 4. 24. 14:43

    JPA 엔티티에서 롬복의 @Builder 패턴을 사용할 경우 @AllAgrsConstructor와 @NoArgsContructor를 붙여야 한다. JPA 스펙에서 엔티티 클래스는 기본 생성자를 가져야 하며, @Builder에서 코드를 만들 때 필드를 받아서 객체를 생성하는 생성자를 필요로 한다. @Builder 패턴에서 생성되는 코드는 다음과 같다. 롬복의 코드와 똑같진 않지만 기본 흐름은 다르지 않다.

     

    public class Person {
        private String name;
        private int age;
    
        public static class PersonBuilder {
            private String name;
            private int age;        
            
            private PersonBuilder() {}
    
            public PersonBuilder name(String name) {
                this.name = name;
                return this;
            }
    
            public PersonBuilder age(int age) {
                this.age = age;
                return this;
            }
    
            public Person build() {
                Person person = new Person();
                
                person.name = this.name;
                person.age = this.age;
                
                return person;
            }
        }
    
        // Static method to create a builder
        public static PersonBuilder builder() {
            return new PersonBuilder();
        }
        
        public Person(String name, long age) {
        	this.name = name;
            this.age = age;
        }
    
        // Private constructor used by builder
        private Person() {}

     

    JPA 엔티티 스펙에 맞추기 위해 protected 이상의 Person 기본 생성자가 필요하기 때문에 @NoArgsContructor를 붙인다. 롬복의 빌더 패턴이 적용된 클래스는 빌더 패턴만 사용할 것을 강제하지 않고 생성자에 파라미터를 주입하는 방식으로도 인스턴스를 생성할 수 있게 되어 있다. 그렇기 때문에 @AllAgrsConstructor가 필요하다.

    Person taetae = Person.builder()
            .name("taetae")
            .age(30)
            .build();
    
    Person tae = new Person("tae", 20);

    '개발 > JPA' 카테고리의 다른 글

    [JPA][Archiving] in_clause_parameter_padding 옵션  (0) 2024.03.03
    Update  (0) 2024.03.03
    스프링부트 3.1.2 Querydsl 설정  (0) 2023.08.02
    페치 조인의 한계과 극복(요약 ver.)  (0) 2023.07.25
    MVCC=TRUE  (0) 2023.07.18

    댓글

Designed by Tistory.