본문 바로가기
Dev Diary

Spring Boot | 읽기 좋은 소스코드를 만드는 비법 1편 | API URL을 설정 파일로 관리하기

by YIAN 2022. 1. 6.

 

 

🤔 상황 (Context)

 

Spring Boot 프로젝트에서 API 통신을 위한 URL을 사용하려고 합니다. 예를 들어, https://yian.tistory.com/guestbook 로 접근한다고 가정하겠습니다. 본 글에서 나오는 코드들은 이해를 돕기 위한 보기용 코드라고 보시면 됩니다. 처음에는 클래스 내 상단에 멤버 변수로 하드코딩 하는 형태로, 다음과 같이 선언해서 사용했습니다. 하단의 내용에서는 properties를 사용했지만, yml을 사용해도 됩니다.

 

변경 전

 

dev / api.properties

tistory.domain=https://dev-yian.tistory.com

 

product / api.properties

tistory.domain=https://yian.tistory.com

 

ServiceImpl.java

@Service
public class ServiceImpl implements Service {

    @Value("${tistory.domain}")
    private String tistoryDomain;
    
    @Override
    public String example() {
    	return "redirect:" + tistoryDomain + "/guestbook";
    }
}

 

  • guestbookUrl: 어떤 환경이든 똑같이 사용되기 때문에, 클래스에 선언해두었습니다.
  • tistoryDomain: 환경별 도메인을 주입 받습니다.

 

그러나, 만약 1개가 아닌 3개의 API가 추가된다면 코드가 지저분해 보이지 않을까요?

API URL을 한 줄로 작성하려고 합니다.

 

 

🙌 해결방법 (Solution or Next Step)

 

위에 있는 코드를 하단의 코드로 변경했습니다.

 

변경 후

 

dev / api.properties

tistory.domain=https://dev-yian.tistory.com

 

product / api.properties

tistory.domain=https://yian.tistory.com

 

common.properties

api.guestbook.url=/guestbook

 

ServiceImpl.java

@Service
public class ServiceImpl implements Service {

    @Value("#{'${tistory.domain}' + '${api.guestbook.url}'}")
    private String tistoryGuestBookUrl;
    
    @Override
    public String example() {
    	return "redirect:" + tistoryGuestBookUrl;
    }
}

 

  • api.properties: 환경별 도메인을 선언합니다.
  • common.properties: 멤버 변수로 하드 코딩했던 API URL을 선언합니다.
  • ServiceImpl.java: Spring EL tag를 이용하여 멤버 변수로 주입받습니다.

 

이렇게 작성하면, API를 제공하는 쪽에서 URL이 바뀌어도 Java 코드를 변경할 필요가 없습니다. 또, API 리스트를 한 곳에서 알아볼 수 있으니 소스 코드 읽기가 좀 더 좋아지고, 관리가 용이해집니다. 

 

 

💡 회고 (Retrospective)

 

처음에는 하드코딩으로 했었는데, 위처럼 바꾸니 코드가 한결 깔끔해졌습니다. 1개만 있을 때는 몰랐지만, 도메인이 3개에 통신해야 하는 API가 3개 이상이면 클래스의 상단 부분이 길어질 것입니다. 하드코딩을 했던 부분을 common.properties처럼 선언해서 사용할 수 있다는 것을 알게 되었습니다.

 

 

💎 참고자료 (References)

 

본 내용은 제가 받은 코드리뷰를 바탕으로 정리한 글입니다. 더 좋은 방법이 있다면 댓글로 말씀해 주세요.

 

 

댓글