[Java] 열거형 enum 사용 이유 및 사용 방법
2023. 12. 22. 21:12ㆍJava
반응형
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>
반응형
'Java' 카테고리의 다른 글
[Java] 유효성 검사 (Validation) / 검증 오류 DTO에 작성하는 방법 (0) | 2023.12.24 |
---|---|
[Java] API / Open API / REST API (0) | 2023.12.23 |
[Java] 객체(Object)의 정의 (0) | 2023.12.22 |