웹 개발/개념 정리

[디자인패턴] 객체 타입, Builder Pattern

cha430 2025. 5. 21. 10:43

 

 

1. 객체 타입

package dev.kloz.sample.boot.main.dto;

import java.util.ArrayList;

import lombok.Builder;
import lombok.Data;

@Builder
@Data
public class MainDto {

	Item data;
	ArrayList<Item> List;

	@Data
	public static class Item {
		String itemName;
		String itemNo;
	}
}

 

Item 클래스에 itemName, itemNo 변수를 담고

Item 타입의 data 변수를 선언했으므로 itemName과 itemNo를 가진 객체 하나를 담을 수 있고

List는 ArrayList이므로  Item 객체를 여러 개 담을 수 있다.

 

 

 

활용 예시

 

import dev.kloz.sample.boot.main.dto.MainDto;
import dev.kloz.sample.boot.main.dto.MainDto.Item;

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {

        // 1. Item 객체 하나 만들기
        Item singleItem = new Item();
        singleItem.setItemName("사과");
        singleItem.setItemNo("001");

        // 2. 여러 개의 Item 객체 만들기
        Item item1 = new Item();
        item1.setItemName("바나나");
        item1.setItemNo("002");

        Item item2 = new Item();
        item2.setItemName("포도");
        item2.setItemNo("003");

        // 3. 리스트에 담기
        ArrayList<Item> itemList = new ArrayList<>();
        itemList.add(item1);
        itemList.add(item2);

        // 4. MainDto에 담기
        MainDto mainDto = MainDto.builder()
                .data(singleItem)    // 하나짜리 상품
                .List(itemList)      // 여러 개 상품 리스트
                .build();

        // 5. 출력
        System.out.println("data: " + mainDto.getData().getItemName()); // 사과
        System.out.println("List:");
        for (Item i : mainDto.getList()) {
            System.out.println("- " + i.getItemName() + " / " + i.getItemNo());
        }
    }
}

 

출력

data: 사과
List:
- 바나나 / 002
- 포도 / 003

 

● 만약 System.out.println(itemList); 할 경우

ArrayList를 출력(Item객체가 두 개 들어있는)하는 것이다.

 

출력

[MainDto.Item(itemName=바나나, itemNo=002), MainDto.Item(itemName=포도, itemNo=003)]

 

 

  Java의 기본 ArrayList는 내부에 들어 있는 객체들의 toString()을 호출해서 보여준다.

 

  @Data 어노테이션이 자동으로 toString()해서 만들어주지만, toString()을 직접 오버라이드해서 만들 수 있다.

 

public static class Item {
    String itemName;
    String itemNo;

    @Override
    public String toString() {
        return "상품명: " + itemName + ", 상품번호: " + itemNo;
    }
}

 

출력 

[상품명: 바나나, 상품번호: 002, 상품명: 포도, 상품번호: 003]

 

 

 

ArrayList 출력 형태

방법 출력 형태
Lombok 자동 (@Data) Item(itemName=값, itemNo=값)
직접 작성한 toString 상품명: 값, 상품번호: 값 (원하는 형식으로 가능!)

 


 

 

 

2. Builder Pattern

 

 : 객체를 만들 때 하나씩 골라담는 것처럼 만드는 방법

 

서브웨이에서 시킬 때 빵은 플랫, 치즈는 모짜렐라, 야채는 전부. 이런식으로 선택하듯이

 

Subway sandwich = Subway.builder()

    .bread("플랫")

    .cheese("모짜렐라")

    .veggie("전부")

    .build()

 

하나씩 골라서 설정한 뒤 마지막에 build() 해주면 서브웨이 객체가 나온다.

 

MainDto mainDto = MainDto.builder()
    .data(singleItem)   // 하나짜리 상품 넣고
    .List(itemList)     // 여러 상품 리스트 넣고
    .build();           // 만들기 끝!

 

// 생성자 사용하면 이렇게 헷갈림
MainDto dto = new MainDto(singleItem, itemList);

 

어떤 값이 어떤 값인지 구체적으로 확인할 수 있기 때문에 builder pattern 이 보기 편하다.

또 필요한 것만 고를 수도 있다.

MainDto dto = MainDto.builder()
    .List(itemList)   // data는 안 넣고
    .build();

 

 

'웹 개발 > 개념 정리' 카테고리의 다른 글

SpringBoot, Vue 의 포트(port) 역할  (2) 2025.05.22
@RequiredArgsConstructor  (0) 2025.05.21
`` 백틱, ${}, {{}}  (0) 2025.05.14
AJAX vs SPA(Single Page Application)  (0) 2025.05.14
절대 경로, 상대 경로  (0) 2025.05.14