κ°λ°μμκ² μ μ§λ³΄μλ λμ΄ μλ κ² κ°λ€. λμ΄λΌκ³ μκ°νκ±΄λ§ λλμ§ μμλ€.π€
(μΉ΄ν‘μλ¦Όν‘ λͺ¨λμ μΈμ λ§λ€λΌλκ±°μ§ λ체)
μΉ΄ν
κ³ λ¦¬ λͺ¨λμ λ λ€λ₯Έ μꡬμ¬νμ΄ λ€μ΄μλ€. naver
λ΄μ€μ μΉ΄ν
κ³ λ¦¬λ₯Ό λΆλ₯νλλ°, λ΄λΆ μ¬μ μΌλ‘ λͺκ°μ§ μΉ΄ν
κ³ λ¦¬λ€μ΄ DB
μλ μ μ₯λμ΄ μμ§λ§ νλ‘ νΈλ¨μλ λ
ΈμΆλμ§ μλλ‘ ν΄λ¬λΌλ μꡬμλ€.
μ΄λ₯Ό μν΄μ stream
μ filter
κΈ°λ₯μ λ€λ€λ³΄μλλ°, λ§μ 곡λΆκ° λμ΄ ν¬μ€ν
νκ³ μνλ€.
νν°λ§ν ν€μλ€μ μ΄λ»κ² μ 리λ₯Ό ν΄μ λ£μκΉ μκ°μ νλ€κ° μ΄λ²κΈ°νμ yml
μ€μ νμΌμ customizing
ν΄μ κ°μΌλ‘ κ°μ Έμ€λ κ²μ μ€μ΅ν΄κΈ°λ‘ νλ€. μ€λ¬΄μμ μ€ννκΈ°
νμ λλΌλ κ±°μ§λ§ μ½λ μ€μΌμΉλ₯Ό νκ³ μ½λ©μ νμ.
- λλ΅μ μΈ μ½λ μ€μΌμΉ
application-category.yml
category.exclude: naver-news-category: - λ΄μ€ν - μ보 - μ€νΌλμΈ - ν¬ν - TV - λνΉλ΄μ€
yml
νμΌμ νλ λ§λ€κ³ (μμΉλ resources
μ λ§λ€μ΄μΌνλ€.) κ·Έκ³³μ μ
λ§λλ‘ μΈν
ν΄μ£Όλ©΄λλ€.
CategoryProperties.java
@Getter @Setter @Configuration @ConfigurationProperties("category.exclude") public class CategoryProperties { private List<String> naverNewsCategory; }
μ, μλμ΄ μ΄μ μμμ λ§λ yml
νμΌκ³Ό λ§€νμ΄ μ§μ μ μΌλ‘ λλ λμ΄λ€.
@configurationProperties
λ λ§€νν yml
νμΌμ΄ 무μμΈμ§ μ€νλ§μκ² μλ €μ£Όλ μν μ νλ€.
μμ yml
νμΌμ 보면 category.exclude
λΌκ³ μ€μ ν μ΄λ¦μ΄ 보μ΄λκ°? κ·Έ κ°μ΄ κ·Έλλ‘ μ΄ μ΄λ
Έν
μ΄μ
μ νλΌλ―Έν°κ°μΌλ‘ λ€μ΄κ°λ κ²μ΄λ€.
μ΄ ν΄λμ€μ λ± νλμλ νλμΈ naverNewsCategory
λ λμΉ μ±κ² μ§λ§ yml
νμΌμ μλ naver-news-category
κ° λ§€νλ κ²μ΄λ€. List
μΈ μ΄μ λ yml
μ€μ μμ μλ - λ΄μ€ν, μ보, μ€νΌλμΈ -
λ±μ΄λ€. μ¦, κ·Έ κ°λ€μ΄ List
λ‘ λ€μ΄κ°μλ€.
yml
μ 컀μ€νΈλ§μ΄μ§ν΄μ μ΄λ κ² μ€μ μΌλ‘ λΉΌλμΌλ©΄ λμ€μ κ°μ λ°κΏ λ λ§€μ° νΈνλ€.
μ΄ λ°©λ²μ μμ©νλ©΄ μ΄κ²μ κ² νμ©ν λΆλΆλ€μ΄ λ€μνλ€.
CategoryDto.java
@Getter @Setter @NoArgsConstructor public class CategoryDto extends CategoryNode { private Map<String, CategoryModifiedDto> children; public CategoryDto(Category entity) { this(entity, null); } public CategoryDto(Category entity, List<String> excludeCodes) { super(entity); children = new HashMap<>(); this.children = entity.getChildrenCategory().stream() .filter(category -> this.exclude(category, excludeCodes)) .sorted(Comparator.comparing(Category::getId)) .collect(Collectors.toMap (Category::getCategoryName, CategoryModifiedDto::new, (x, y) -> x, LinkedHashMap::new)); } private boolean exclude(Category category, List<String> excludeCodes) { return excludeCodes == null || !excludeCodes.contains(category.getCode()); } }
CategoryDto(Category entity, List<String> excludeCodes)
velog
μ μ°μ¬νμ λλ§ ν΄λ μΉ΄ν
κ³ λ¦¬ μ½λλ€μ΄ μλΉν κ°λ²Όμ λλ° μ΄λμ μ΄λ κ² λ¬΄κ±°μμ‘λ€.
μ΄λ² μꡬμ¬νμΌλ‘ μΈν΄ DTO
νλΌλ―Έν°κ° λ νλ μΆκ°λμλ€.
boolean exclude
λ©μλ
μ΄ λ©μλκ° ν΅μ¬μ΄λ€. κ·Ήνμ ν¨μ¨νλ₯Ό νλ€.
νλΌλ―Έν°λ‘ Category
μν°ν°μ κ±Έλ¬λΌ ν€μλλ€μ list
λ₯Ό λ°λλ€.
boolean
νμ
μΌλ‘ 리ν΄νμ¬ filter
μ 쑰건μ λ£μ΄μ€λ€.
.filter(category -> this.exclude(category, excludeCodes))
filter
λ true
λ©΄ ν΅κ³Όμν€κ³ , false
μ΄λ©΄ κ±Έλ¬λ΄λ²λ¦°λ€.
entity
λ₯Ό stream
μ ν΅ν΄ μ»μ΄λΈ category
μ νλΌλ―Έν°λ‘ λ°μ excludeCodes
λ₯Ό ν΅ν΄ boolean
κ°μ λ°ννλ€.
ν΄λΉ μ½λλ service
κ³μΈ΅μμ μ¬μ©λ λ, CategoryProperties
ν΄λμ€λ₯Ό @RequiredArgsConstructor
λ₯Ό ν΅ν΄ μμ‘΄μ± μ£Όμ
μ ν ν, μ¬μ©νμ¬ λ£μ΄μ£Όκ³ , Rest Controller
μμ μ¬μ©λλ€.
μ€λλ λκΌλ€. κ°κ° stream
yml
μ λ¨μν μ€μ λ§ νλ μ©λλΌκ³ μκ°νλ λΆλ€μ΄ μ΄ κΈμ μ½κ³ λμλ νμ©λ²μ΄ λ€μνλ€λ κ²μ μμ
¨μΌλ©΄ μ’κ² λ€. μ΄ λ°©λ²μ ν΅νλ€λ©΄ κ³ μ λμ΄μλ κ°μ΄λ κ·Έλ‘ μΈν΄ λ°λ³΅λλ μ½λλ€μ ν μ€μΌ μ μμ κ²μ΄λ€.
κ·ΈλΌ μ΄λ§ β