Backend

[λ””μžμΈ νŒ¨ν„΄] builderνŒ¨ν„΄

μž₯μš©μ„ 2024. 2. 18. 18:17

 

πŸ€” λΉŒλ” νŒ¨ν„΄(Builder Pattern) ?

λ³΅μž‘ν•œ 객체의 생성 κ³Όμ •κ³Ό ν‘œν˜„ 방법을 λΆ„λ¦¬ν•˜μ—¬ λ‹€μ–‘ν•œ κ΅¬μ„±μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“œλŠ” 생성 νŒ¨ν„΄μ΄λ‹€. μƒμ„±μžμ— λ“€μ–΄κ°ˆ 맀개 λ³€μˆ˜λ₯Ό λ©”μ„œλ“œλ‘œ ν•˜λ‚˜ν•˜λ‚˜ 받아듀이고 λ§ˆμ§€λ§‰μ— 톡합 λΉŒλ“œν•΄μ„œ 객체λ₯Ό μƒμ„±ν•˜λŠ” 방식이닀.

좜처 : Inpa Dev

 

βœ” κΈ°μ‘΄ νŒ¨ν„΄

πŸ”Ž μƒμ„±μž νŒ¨ν„΄

μƒμ„±μžλ₯Ό ν†΅ν•΄μ„œ 값을 μ„€μ •ν•˜λŠ” νŒ¨ν„΄μ΄λ‹€.

μ˜€λ²„λ‘œλ”©μ„ 톡해 ν•„μˆ˜λ‘œ μ„€μ •ν•΄μ•Όν•˜λŠ” κ°’λ“€κ³Ό ν•˜μ§€ μ•Šμ•„λ„ λ˜λŠ” 값듀을 μ‘°μ ˆν•˜μ—¬ λ§Œλ“€ 수 μžˆλ‹€.

ν•˜μ§€λ§Œ 클래슀의 ν•„λ“œκ°€ λ§Žμ„κ²½μš° μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜ λ˜ν•œ λŠ˜μ–΄λ‚˜κ²Œ 되고 μž…λ ₯ν•œ λ§€κ°œλ³€μˆ˜μ˜ μˆœμ„œμ— 맞게 값듀을 μž…λ ₯ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— μˆœμ„œλ₯Ό λͺ¨λ‘ κΈ°μ–΅ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ μ‹€μˆ˜λ₯Ό μœ λ°œν•  수 있고,

μƒλž΅ν•˜κ³ μ‹Άμ€ λ§€κ°œλ³€μˆ˜λ₯Ό μ„ νƒμ μœΌλ‘œ μƒλž΅ν•  수 μ—†λ‹€.

public class Member{

	private String id;
	private String name;
    private String address;
    private String email;
    
    public Member(String id, String name, String address, String email){
        this.id = id;
        this.name = name;
        this.address = address;
        this.email = email;
    }
}

 

πŸ”Ž μžλ°” 빈(Java Beans) νŒ¨ν„΄

Setterλ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 클래슀 ν•„λ“œμ— 값을 μ„€μ •ν•˜λŠ” νŒ¨ν„΄μ΄λ‹€.

μƒμ„±μž νŒ¨ν„΄μ—μ„œμ˜ λ¬Έμ œμ λ“€μ„ setterλ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 값을 직접 μ„€μ •ν•˜κ³ , μƒλž΅ν•˜κ³  싢은 값을 μ„ νƒμ μœΌλ‘œ μƒλž΅ν•  수 μžˆλ‹€.

ν•˜μ§€λ§Œ μ΄λŸ¬ν•œ μœ μ—°ν•œ κ°’ μ„€μ •μœΌλ‘œ 인해 일관성(consistency)κ³Ό λΆˆλ³€μ„±(immutable)에 λŒ€ν•œ λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.

일관성 : 객체 생성 μ‹œμ μ— λͺ¨λ“  값을 μ£Όμž…ν•˜μ§€ μ•Šκ³  생성 이후 κ°œλ°œμžκ°€ setterλ©”μ†Œλ“œλ₯Ό 톡해 μ„€μ •ν•˜κΈ° λ•Œλ¬Έμ— κΌ­ μ„ΈνŒ…λ˜μ–΄μ•Ό ν•  값이 μ„ΈνŒ…λ˜μ§€ μ•Šκ³  μ‚¬μš©ν•˜κ²Œ 되면 일관성이 κΉ¨μ§€κ²Œ λœλ‹€.

λΆˆλ³€μ„± : 객체λ₯Ό μƒμ„±ν• λ•Œ ν•„λ“œ 값을 μ„€μ •ν•˜κΈ° μœ„ν•΄ setterλ©”μ†Œλ“œλ₯Ό λ§Œλ“€μ—ˆμ§€λ§Œ μ™ΈλΆ€μ—μ„œ setterλ©”μ†Œλ“œμ— 접근이 κ°€λŠ₯ν•˜λ‹€ ,μ΄λŠ” μ–΄λ””μ„œ λˆ„κ΅°κ°€ setterλ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ 객체λ₯Ό μˆ˜μ •ν•  수 μžˆλŠ” μ—¬μ§€κ°€ 있기 λ•Œλ¬Έμ— λΆˆλ³€μ„±μ„ 보μž₯ν•  수 μ—†λ‹€.

public class Member{

	private String id;
	private String name;
    private String address;
    private String email;
    
    public void setId(String id){
    	this.id = id;
    }
    public void setName(String name){
    	this.name = name;
    }
    public void setAddress(String address){
    	this.address = address;
    }
    public void setEmail(String email){
    	this.email = email;
    }
}

 

βœ” λΉŒλ” νŒ¨ν„΄

λ³„λ„μ˜ Builder 클래슀λ₯Ό λ§Œλ“€μ–΄ λ©”μ†Œλ“œλ₯Ό 톡해 값을 μž…λ ₯ 받은 ν›„ build()λ©”μ†Œλ“œλ‘œ ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œλ‹€.

πŸ“Ž κ΅¬ν˜„

public class Member {

    private String id;
    private String name;
    private String address;
    private String email;

    private Member(MemberBuilder builder){
        this.id = builder.id;
        this.name = builder.name;
        this.address = builder.address;
        this.email = builder.email;
    }
    
    public static class MemberBuilder {
        private String id;
        private String name;
        private String address;
        private String email;

        public MemberBuilder id(String id){
            this.id = id;
            return this;
        }
        public MemberBuilder name(String name){
            this.name = name;
            return this;
        }
        public MemberBuilder address(String address){
            this.address = address;
            return this;
        }
        public MemberBuilder email(String email){
            this.email = email;
            return this;
        }
        public Member build(){
            return new Member(this);
        }
    }
}

πŸ“Ž μ‚¬μš©

public static void main(String[] args) {
    Member member = new MemberBuilder()
            .id("test")
            .name("name")
            .address("address")
            .email("email")
            .build();
}

buiderλ©”μ†Œλ“œλ₯Ό 톡해 객체λ₯Ό μƒμ„±ν•˜κ³  ν•„λ“œλͺ…κ³Ό 같은 λ©”μ†Œλ“œλ₯Ό ν†΅ν•΄μ„œ 값을 μ„€μ •ν•˜κΈ° λ•Œλ¬Έμ— 가독성도 ν–₯μƒλœλ‹€.

λ˜ν•œ ν•„λ“œμ˜ 값을 μ„€μ •ν•˜λŠ” λ©”μ†Œλ“œλ“€μ€ this 즉 MemberBuilderλ₯Ό returnν•˜κΈ° λ•Œλ¬Έμ— 체이닝을 μ‚¬μš©ν•˜μ—¬ μˆœμ„œμ™€ 상관 없이 값을 μ„€μ • ν•˜λ©΄μ„œ 기쑴의 μƒμ„±μž νŒ¨ν„΄μ˜ λ¬Έμ œμ λ“€μ„ λ³΄μ™„ν•˜κ³ , build λ©”μ†Œλ“œλ₯Ό 톡해 값을 μ„€μ •ν•˜λ©΄μ„œ μƒμ„±λ˜κ³  κ·Έ ν›„μ—λŠ” μˆ˜μ •ν•  수 μ—†κΈ° λ•Œλ¬Έμ— μžλ°” 빈 νŒ¨ν„΄μ—μ„œμ˜ λ¬Έμ œμ μ΄μ—ˆλ˜ 일관성과 λΆˆλ³€μ„±μ— κ΄€ν•œ λ¬Έμ œλ„ 보완할 수 μžˆλ‹€.

이와 같은 μΌκ΄€λœ ν”„λ‘œμ„ΈμŠ€λ‘œ 객체λ₯Ό μƒμ„±ν•˜κΈ° λ•Œλ¬Έμ— μ„€μ • 였λ₯˜μ™€ 같은 μ‹€μˆ˜λ˜ν•œ λ°©μ§€ ν•  수 μžˆλ‹€.

 

ν•˜μ§€λ§Œ 객체의 ν•„λ“œλ“€μ΄ λ§Žμ§€ μ•Šλ‹€λ©΄ μƒμ„±μž νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λŠ”κ²ƒμ΄ 더 λ‚˜μ€ 선택일 수 μžˆλ‹€.

μ™œλƒν•˜λ©΄ 가독성, κ°’ μ„€μ • μˆœμ„œ, κ°’ μƒλž΅ λ“± 같은 μƒμ„±μž νŒ¨ν„΄μ˜ 단점이 ν•„λ“œκ°€ 적음으둜써 극볡 될 수 μžˆλ‹€.

λ˜ν•œ λΉŒλ“œ νŒ¨ν„΄μ€ μ½”λ“œμ˜ λ³΅μž‘μ„±μ΄ μ˜¬λΌκ°„λ‹€λŠ” 단점이 μžˆλ‹€.

(Lombok라이브러리의 @Builder μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 λΉŒλ” 클래슀λ₯Ό λ§Œλ“€μ§€ μ•Šκ³  λΉŒλ” νŒ¨ν„΄μ„ μ‚¬μš©ν•  수 μžˆλ‹€.)