[Java] 열거형 enum 사용 이유 및 사용 방법

2023. 12. 22. 21:12Java

반응형

 

 

enum

상수들의 집합을 정의하고, 해당 상수들을 사용하는 데 도움을 줌

클래스처럼 동작

필요에 따라 메서드, 생성자 등을 추가 가능

 

 

장점

- 코드의 가독성이 향상

- 코드에서 의미를 명확하게 전달

- 잘못된 상수 사용으로 인한 오류를 줄일 수 있음

- 각 열거 상수에 추가 정보 포함 가능

 


 

* 기본 enum

Days : 열거형의 이름

중괄호 안에 나열된 것들은 Days 열거형에 속하는 상수들

일반적으로 대문자로 작성

public enum Days {
    SUNDAY,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY
}

 

 

* enum에 추가 정보 포함

각 요일에 대한 약어(abbreviation)를 추가 정보 저장

public enum Days {
    SUNDAY("Sun"),
    MONDAY("Mon"),
    TUESDAY("Tue"),
    WEDNESDAY("Wed"),
    THURSDAY("Thu"),
    FRIDAY("Fri"),
    SATURDAY("Sat");

    private final String abbreviation;

    private Days(String abbreviation) {
        this.abbreviation = abbreviation;
    }

    public String getAbbreviation() {
        return abbreviation;
    }
}

 

 

* 한글을 이용한 enum

열거형(enum)을 사용하여 상품 카테고리의 열거 타입을 정의

public enum CategoryTypeRole {

  ALL("전체"),
  LIVING("생활용품"),
  BATHROOM("욕실용품"),
  KITCHEN("주방용품"),
  MEMBERSALE("회원전용");

  private final String description;

  CategoryTypeRole(String description) {
    this.description = description;
  }
  public String getDescription() {
    return description;
  }

}
더보기
열거형의 이름 : CategoryTypeRole


다섯 개의 상수 : ALL / LIVING / BATHROOM / KITCHEN / MEMBERSALE

description 변수 : 각 상수는 해당 카테고리의 설명을 저장

getDescription : 설명을 가져옴

 

 

* 숫자 코드를 추가  한 enum

각 상수는 code라는 int 변수를 가지게 되고, 생성자에서 이 코드를 초기화

  ALL(0, "전체"),
  LIVING(1, "생활용품"),
  BATHROOM(2, "욕실용품"),
  KITCHEN(3, "주방용품"),
  MEMBERSALE(4, "회원전용");

  private final int code;
  private final String description;

  CategoryTypeRole(int code, String description) {
    this.code = code;
    this.description = description;
  }

  public int getCode() {
    return code;
  }

  public String getDescription() {
    return description;
  }

 

 


 

enum 생성 후,

* Entity

@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Table(name = "product")
@SequenceGenerator(
    name = "product_SEQ",
    sequenceName = "product_SEQ",
    initialValue = 1,
    allocationSize = 1
)
public class ProductEntity extends BaseEntity {

  //기본키
  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "product_SEQ")
  private Integer productId;
  
  //카테고리유형
  @Enumerated(EnumType.STRING)
  private CategoryTypeRole categoryTypeRole;
  
  }

 

 

 

* DTO

@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ProductDTO {

  //기본키
  private Integer productId;
  
  //카테고리유형
  private CategoryTypeRole categoryTypeRole;
  
  }

 

 

 

* Repository

카테고리 유형별로 상품진열

@Repository
public interface ProductRepository extends JpaRepository<ProductEntity, Integer> {

  @Query("SELECT p FROM ProductEntity p WHERE p.categoryTypeRole = :categoryTypeRole")
  Page<ProductEntity> findProductEntityByCategoryTypeRole (@Param("categoryTypeRole") CategoryTypeRole categoryTypeRole, Pageable pageable);

}

 

 

 

* Controller

제품등록

  @GetMapping("/admin_product_insert")
  public String productInsertForm(Model model) throws Exception {

    ProductDTO productDTO = new ProductDTO();

    model.addAttribute("productDTO", productDTO);
    model.addAttribute("categoryType", CategoryTypeRole.values());

    return "/admin/product_insert";
  }



  // 상품 등록 처리 (상품 정보 및 이미지 업로드)
  @PostMapping("/admin_product_insert")
  public String productInsertProc(@Valid @ModelAttribute("productDTO") ProductDTO productDTO,
                                  BindingResult bindingResult,
                                  @RequestParam("images") List<MultipartFile> imageFiles,
                                  Model model) {

    //검증오류
    if (bindingResult.hasErrors()) {
      model.addAttribute("categoryType",CategoryTypeRole.values());
      return "/admin/product_insert";
    }

	...

  }

 

제품목록

  @GetMapping("/admin_productlist")
  public String listForm(@RequestParam(value = "categoryType", defaultValue = "") String categoryType,
                         @PageableDefault(page = 1) Pageable pageable,
                         Model model) throws Exception {

    // CategoryTypeRole 열거형의 한글 설명을 리스트로 가져오기
    List<String> categoryOptions = Arrays.stream(CategoryTypeRole.values())
        .map(CategoryTypeRole::getDescription)
        .collect(Collectors.toList());
    model.addAttribute("categoryOptions", categoryOptions);

    Page<ProductDTO> productDTOS = productService.adminFindAll(categoryType, pageable);

    ...
    
    model.addAttribute("productDTOS", productDTOS);

    return "/admin/product_list";

  }

 

 

* productInsesrt.html

			   <tr>
                                <th scope="row" class="notice-padding" id="CategoryTypeRole">카테고리</th>
                                <td class="notice-info">
                                    <div class="sidebar-widget update">
                                        <div class="sidebar-archive-wrap">
                                            <select name="CategoryTypeRole" th:field="*{categoryTypeRole}">
                                                <option th:each="state : ${categoryType}"
                                                        th:unless="${state.name() == 'ALL'}"
                                                        th:value="${state.name()}"
                                                        th:text="${state.getDescription()}"
                                                        th:selected="${state.name() eq data?.categoryTypeRole?.name()}"></option>
                                                </option>
                                            </select>
                                        </div>
                                    </div>
                                </td>
                            </tr>

 

반응형