Develop/java

org.apache.commons.lang.StringUtils 활용하기

Fkaa 2023. 3. 5. 16:28

Java를 통해 프로젝트를 작성하다 보면 간혹 String 타입을 가지고 형태를 변환 및 검사하는 경우가 발생한다.

 

예를 들어 게시판 페이지의 목록 노출과 관련된 케이스를 살펴보자


1. 요구사항

  - 게시판 페이지에서 작성된 게시판 목록을 불러오면서 닉네임이 등록된 회원의 경우는 닉네임으로, 등록되지 않은 회원은 ID로 표기한다.

  - 요구사항 목업

 

2. DB 구조

- 게시글 데이터를 관리하는 테이블은 다음과 같은 필드로 구성

  - 게시글 id, 작성 회원 id, 게시글 제목, 게시글 본문, 게시글 작성일자, 조회수

- 회원 데이터를 관리하는 테이블은 다음과 같은 필드로 구성

  - 회원 id, 회원 비밀번호, 회원 이름, 회원 닉네임, 회원 이메일

 

3. 게시글 리스트 조회 FlowChart

- 게시글 리스트 조회 API 호출

  - 파라미터 타입은 다음과 같으며, 현재 작성 중인 글에서는 다루지 않는다.

    - limit(게시글 노출 개수)

    - page(현재 페이지)

    - searchKeyword(게시글 검색 키워드)

    - searchCondition(게시글 검색 조건)

- 파라미터로 전달된 데이터를 바탕으로 게시글 리스트를 조회

- 조회된 게시글 리스트 DTO에서 작성회원 id를 바탕으로 회원정보 매핑

- 게시글 작성자의 회원정보에서 닉네임이 null일 경우 id로, notNull일 경우 닉네임으로 반환

- 게시글 리스트 Response Return


BE 개발자로서 한번씩은 겪어보는 게시판 도메인을 만드는 것을 예제로 가지고 왔다.

 

위의 내용 중 3. 게시글 리스트 조회 Flowchart >> 게시글 작성자의 회원 정보에서 닉네임이 null일 경우...  를 통해 설명하기 위해 굉장히 멀리 돌아온것 같지만... 모로 가도 서울로 가면 된다고 하니..까..

 

어느 길로 왔건 위 상황에서 처리 방법 중 가장 쉽게 떠오르는 방법은 

1. 게시글 리스트에 입력되어 있는 작성회원 Id를 토대로 회원정보 조회
2. 조회된 회원의 닉네임 null 여부를 조건문으로 분기
3. null일 경우 response 객체의 작성자에 id 매핑
4. null이 아닐 경우 response 객체의 작성자에 nickname 매핑

 

위와 같이 처리할 수 있을 것 같다.

 

포스팅의 제목과 같이 org.apache.commons.lang 라이브러리의 StringUtils 클래스를 활용해서 재정리해보자

 

위 처리한 방법에서 1. 게시글 리스트에 입력되어 있는 작성 회원 Id를 토대로 회원정보 조회 하는 부분에서 Response 객체로 변환하는 과정에서 처리해 줄 수 있을 것 같다.

 

한 문장으로 처리하려니 포스팅하는 나도 헷갈리는 것 같으니 단계적으로 나누어서 작성해 보면 다음과 같다.

1. 게시글 리스트 조회를 통해 게시글 리스트 DTO 생성
2. 게시글 리스트에 등록되어 있는 작성자 id를 토대로 작성자 정보 DTO 생성
3. Response 객체에 데이터를 내려주면서 함수를 통해 처리

* Response 팩토리 생성자와 작성자 표기정보 설정 함수

import org.apache.commons.lang3.StringUtils;

public static ArticlesResponse(ArticleDto articleDto, UserAccountDto userDto) {
	return new ArticlesResponse(
    	articleDto.getArticleId(),
        validateArticleWriterDisplayName(userDto),
        articleDto.getTitle(),
        articleDto.getContent(),
        articleDto.getCreatedAt(),
        articleDto.getHits()
    );
    
private String validateArticleWriterDisplayName(UserAccountDto userDto) {
	return StringUtils.isEmpty(userDto.getNickname())
    		? userDto.getUserId()
            : userDto.getUserNickname();
}

 

위처럼 Response 객체를 생성하는 과정에서 매핑된 회원의 정보를 통해 설정해 주는 방법도 가능하다.

 

어떤 방법이던 컨벤션에 따라 변경될 가능성이 높은 코드이지만 개인적으로는 if문을 통한 분기처리를 가능한 회피하는 것을 선호하기 때문에 위와 같은 방법으로 자주 설계하고 있다.

 

일부만 발췌하여 작성한 내용이어서 부분적으로 읽기 어렵고 이해하기 복잡하다는 느낌도 들기 때문에 시간을 내어 위와 같은 상황의 풀코드를 이 포스팅과 연결시켜 작성해 보는 것도 좋을 것 같다.

 

그리고 StringUtils의 메서드는 isEmpty() 외에도 아주 많으니 그 내용을 포스팅하여 연결하는 것도 좋을 것 같다.

 

끝으로 apache의 StringUtils 외에도 다양한 라이브러리에서도 StringUtils을 지원해 주는데 왜 굳이 꼭! apache를 선택했느냐 하는 것은 isEmpty() 외에도 isNotEmpty() 함수가 있어 비트연산자를 사용하지 않아 코드의 가독성을 높일 수 있는 라이브러리라고 생각하기 때문에 애용하고 있다. :)

'Develop > java' 카테고리의 다른 글

99클럽 코테 스터디 1일차 TIL + 문자열 탐색  (0) 2025.01.13