TIL (20210817) - yml customizing, Map filter ν•˜κΈ°

Joshua_KimΒ·2021λ…„ 8μ›” 17일
1

πŸ“– TIL

λͺ©λ‘ 보기
4/8
post-thumbnail

🌱 μ„œλ‘ 

  • κ°œλ°œμžμ—κ² μœ μ§€λ³΄μˆ˜λŠ” 끝이 μ—†λŠ” 것 κ°™λ‹€. 끝이라고 μƒκ°ν–ˆκ±΄λ§Œ λλ‚˜μ§€ μ•Šμ•˜λ‹€.πŸ€”
    (μΉ΄ν†‘μ•Œλ¦Όν†‘ λͺ¨λ“ˆμ€ μ–Έμ œλ§Œλ“€λΌλŠ”κ±°μ§€ λŒ€μ²΄)

  • μΉ΄ν…Œκ³ λ¦¬ λͺ¨λ“ˆμ— 또 λ‹€λ₯Έ μš”κ΅¬μ‚¬ν•­μ΄ λ“€μ–΄μ™”λ‹€. naver λ‰΄μŠ€μ˜ μΉ΄ν…Œκ³ λ¦¬λ₯Ό λΆ„λ₯˜ν•˜λŠ”데, λ‚΄λΆ€ μ‚¬μ •μœΌλ‘œ λͺ‡κ°€μ§€ μΉ΄ν…Œκ³ λ¦¬λ“€μ΄ DBμ—λŠ” μ €μž₯λ˜μ–΄ μžˆμ§€λ§Œ ν”„λ‘ νŠΈλ‹¨μ—λŠ” λ…ΈμΆœλ˜μ§€ μ•Šλ„λ‘ ν•΄λ‹¬λΌλŠ” μš”κ΅¬μ˜€λ‹€.

  • 이λ₯Ό μœ„ν•΄μ„œ stream의 filterκΈ°λŠ₯을 λ‹€λ€„λ³΄μ•˜λŠ”λ°, λ§Žμ€ 곡뢀가 λ˜μ–΄ ν¬μŠ€νŒ…ν•˜κ³ μžν•œλ‹€.

πŸ— 였늘 TIL의 ν‚€ 포인트 : yml

  • 필터링할 ν‚€μ›Œλ“€μ„ μ–΄λ–»κ²Œ 정리λ₯Ό ν•΄μ„œ λ„£μ„κΉŒ 생각을 ν•˜λ‹€κ°€ μ΄λ²ˆκΈ°νšŒμ— yml μ„€μ • νŒŒμΌμ„ customizingν•΄μ„œ κ°’μœΌλ‘œ κ°€μ Έμ˜€λŠ” 것을 μ‹€μŠ΅ν•΄κΈ°λ‘œ ν–ˆλ‹€. μ‹€λ¬΄μ—μ„œ μ‹€ν—˜ν•˜κΈ°

  • 항상 λŠλΌλŠ” κ±°μ§€λ§Œ μ½”λ“œ μŠ€μΌ€μΉ˜λ₯Ό ν•˜κ³  코딩을 ν•˜μž.

  • λŒ€λž΅μ μΈ μ½”λ“œ μŠ€μΌ€μΉ˜

πŸ‘‰πŸ» step 1. yml νŒŒμΌμ— filter둜 κ±ΈλŸ¬λ‚Ό ν‚€μ›Œλ“œ μ„ΈνŒ…ν•˜κΈ°

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을 μ»€μŠ€νŠΈλ§ˆμ΄μ§•ν•΄μ„œ μ΄λ ‡κ²Œ μ„€μ •μœΌλ‘œ λΉΌλ†“μœΌλ©΄ λ‚˜μ€‘μ— 값을 λ°”κΏ€ λ•Œ 맀우 νŽΈν•˜λ‹€.
    이 방법을 μ‘μš©ν•˜λ©΄ 이것저것 ν™œμš©ν•  뢀뢄듀이 λ‹€μ–‘ν•˜λ‹€.

πŸ‘‰πŸ» step 2. stream에 filter 달기 (feat. ν•„μ‚΄ λ©”μ†Œλ“œ 신곡)

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μ—μ„œ μ‚¬μš©λœλ‹€.

πŸ™ 였늘의 TIL 을 마치며

  • μ˜€λŠ˜λ„ λŠκΌˆλ‹€. κ°“κ°“ stream

  • yml을 λ‹¨μˆœνžˆ μ„€μ •λ§Œ ν•˜λŠ” μš©λ„λΌκ³  μƒκ°ν–ˆλ˜ 뢄듀이 이 글을 μ½κ³ λ‚˜μ„œλŠ” ν™œμš©λ²•μ΄ λ‹€μ–‘ν•˜λ‹€λŠ” 것을 μ•„μ…¨μœΌλ©΄ μ’‹κ² λ‹€. 이 방법을 ν†΅ν•œλ‹€λ©΄ κ³ μ •λ˜μ–΄μžˆλŠ” κ°’μ΄λ‚˜ 그둜 인해 λ°˜λ³΅λ˜λŠ” μ½”λ“œλ“€μ„ ν™• 쀄일 수 μžˆμ„ 것이닀.

  • 그럼 이만 βœ‹

profile
인문학 ν•˜λŠ” 개발자 πŸ’»

0개의 λŒ“κΈ€