🤔 상황 (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)
본 내용은 제가 받은 코드리뷰를 바탕으로 정리한 글입니다. 더 좋은 방법이 있다면 댓글로 말씀해 주세요.
'Dev Diary' 카테고리의 다른 글
랜선모각코 구성원 모집해요! (0) | 2021.08.30 |
---|---|
티스토리 블로그에 GitHub 댓글 utterances 적용하기 (2) | 2021.08.09 |
댓글