무조건 상수로 관리해야 하는가?

Hyunsoo Kim·2024년 5월 22일
0

스프링

목록 보기
7/13
post-thumbnail

과거 우테코 프리코스에 참여할 때, 상수 선언에 관해 배우고 신나게 써먹었던 기억이 있다. 당시 어떤 기준도 없이 큰따옴표가 등장하는 모든 코드에 상수를 먹였는데, 이러다 보니 시간이 매우 오래 걸렸다. 변수명을 정하는 건 쉬운 일이 아니었기 때문이다.

시간이 흘러 현직 개발자가 되고, 코드를 리팩토링하면서 같은 고민을 하게 되었다.

'어떤 값을 상수로 관리해야 하는가?'

코드를 보다 보니, 굳이 상수로 관리해야 하나 싶은 값들이 존재했다.


상수(Constant)

상수는 변수의 반댓말로 '변하지 않고 고정된 값'을 의미한다. 예를 들면, 1분은 60초, 1시간은 60분, 하루는 24시간처럼 고정되어 있는 값이라고 생각하면 된다.

프로젝트를 진행하다 보면 코드 안에서 변하지 않고 고정된 값들이 등장하게 된다.

session.getAttribute("userId");

해당 코드는 세션에 userId 값을 가져오는 코드이다. 이때, 'userId'는 안에 담긴 데이터는 다를지 언정, 유저 아이디를 가져오는 데에는 변함이 없다.

그렇다면 'userId'는 자바에서 다음과 같은 상수로 선언이 가능하다.

private static final String USER_ID = "userId";

session.getAttribute(USER_ID);

자바는 상수를 구현하기 위해 final이란 키워드를 사용한다. 또한 자바에서 상수를 관리할 때는 대문자에 언더바를 넣어 구분하는 대문자 스네이크 표기법(SNAKE_CASE)를 사용한다.

상수를 사용하는 이유?

1) 프로그램이 실행되면서 값이 변하면 안 되는 경우

위의 코드로 예를 들어보자. 다른 코드를 작성하며 값을 할당하던 중 "userId"에서 오타가 나 "UserId"가 되었다. 이 경우, 실행하면 당연히 UserId는 값을 받아오지 못한다.

상수를 선언하면 기존에 사용하던 상수를 그대로 가져오면 되므로, 이러한 실수가 줄어든다.

2) 코드의 가독성을 높이고 싶은 경우

session.getAttribute("a")

코드를 보고 "a"가 어떤 값인지 파악할 수 있는가? 아마 코드를 작성한 개발자 이외에는 어떤 걸 의미하는지 바로 알아챌 수 있는 사람이 없을 것이다.

그렇다면 아래 코드를 보자.

private static final String USER_ID = "a";

session.getAttribute(USER_ID);

상수로 선언된 값을 보니, 유저 아이디 값을 'a'라고 지정해놓은 것을 바로 파악할 수 있다. 이렇듯 코드 한줄만 보고도 해당 코드의 의미를 파악하기 위해서 상수를 선언한다.

3) 쉽게 유지보수하고자 하는 경우

동일한 값을 선언한 코드가 여기저기 있을 경우, 값이 바뀌면 해당 코드를 모두 찾아서 변경해주어야 한다. 하지만 상수를 선언하면, 해당 상수 코드만 바꾸면 되니 유지보수에도 매우 편리하다.

아래 예시를 들어보자.

코드 1:

session.getAttribute("a");
session.getAttribute("b");
session.getAttribute("c");

...

session.setAttribute("a");
session.setAttribute("b");
session.setAttribute("c");

코드 2:

private static final String USER_ID = "a";

session.getAttribute(USER_ID);

...

session.setAttribute(USER_ID);

코드 1은 "a"란 값을 수정하기 위해서 값이 할당된 모든 코드를 찾아 돌아다녀야 한다. 하지만 코드 2는 "a"를 수정하기 위해서 맨 위에 수정한 상수만 바꾸면 된다.


상수는 어떻게 관리해야 하는가?

상수를 이용했을 때 다양한 장점이 있다는 것을 살펴보았다. 하지만 모든 값을 무조건 상수로 관리하는 것이 이득일까?

앞의 코드를 가져와서 다시 살펴보자.

private static final String USER_ID = "userId";

session.getAttribute(USER_ID);

해당 코드는 상수를 선언하지 않고 'userId' 값을 그대로 할당해도 다른 개발자들이 코드를 파악하는 데 어려움이 없다.

심지어 해당 코드에 사용된 값이 오로지 한 번 사용된다면 오히려 상수를 사용하는 게 비효율적일 수 있다.

그리하여 나는 상수 선언에 몇 가지 기준을 두었다.

첫째, 의미가 명확한 값은 그대로 두자.

굳이 상수를 선언하지 않아도 코드를 파악하기에 어려움이 없는 코드는 값을 그대로 두기로 했다. 특히 상수로 선언할 때, 카멜케이스를 스네이크케이스로 변경만 해서 선언하는 값들은 모두 상수 선언 없이 두기로 했다.

둘째, 한 번만 사용되는 값은 그대로 두자.

물론 추가로 개발하면서 해당 값을 사용하는 코드가 생길 수 있다. 하지만 그것까지 고려하면서 모조리 상수로 선언하는 건 비효율적이다. 차라리 값을 그대로 두고, 차후에 해당 값을 더 쓰게 되는 경우 상수로 관리하는 편이 낫다.

셋째, 프로젝트 전반적으로 사용되는 상수는 클래스를 통해 따로 관리하자.

유지보수를 용이하게 진행하기 위해 상수를 쓰는 만큼 프로젝트 전반에 사용되는 상수는 클래스마다 선언하기 보다는, constant 경로로 따로 분리하여 사용한다.

단, 이때 확장자로 private을 사용할 수 없는 만큼, 객체스러운 코딩을 위해 상수 구분을 명확히 하자.


개발자마다 상수를 사용하는 방법은 다르다. 지금 나는 위와 같은 방식으로 상수를 관리하고 있고, 해당 기준에 대해 팀과 합의한 상태이지만합의한 상태이지만 시간이 흐르고 연차가 쌓이며 다른 기준이 생길 수도 있다.

그만큼 상수를 사용하는 건 개인의 기준과 조직의 기준이 명확해야 하는 것 같다.

profile
다부진 미래를 만들어가는 개발자

0개의 댓글