소스 코드에서 숫자, 문자를 하드 코딩하지 않는 것이 좋은 프로그래밍 습관으로 알고 있다. 이에 대한 연장선으로 다음과 같이 모든 URL을 하나의 클래스에 모아 상수 값으로 구현하고 각 Controller에서 사용하는 다음의 코드는 괜찮은가?
public class WebServletURL {
public static final String GROUP_CREATE = "/group/create";
public static final String GROUP_DELETE = "/group/delete";
public static final String GROUP_READ = "/group/read";
public static final String NOTELIST = "/g/*";
public static final String NOTELIST_READ = "/notelist/read/*";
public static final String NOTE_CREATE = "/note/create";
public static final String NOTE_READ = "/note/read";
public static final String USER_CREATE = "/user/create";
public static final String USER_LOGIN = "/user/login";
public static final String USER_LOGOUT = "/user/logout";
}
위와 같이 정의하고 다음과 같이 사용한다.
@WebServlet(WebServletURL.GROUP_CREATE)
public class CreateGroupServlet extends HttpServlet {
[...]
}
위와 같이 구현하는 것이 문제가 있다고 생각하는 부분이 있다면 무엇일까? 위와 같이 구현하지 않는다면 각 Controller에서 URL을 Mapping하는 경우가 있을텐데 그와 같이 구현할 경우의 장점은 뭘까? 다른 이슈는 없을까?
소스 코드 리뷰를 하면서 느끼지만 항상 이 방식이 맞는 것은 아니라고 것을 종종 느낀다.
0개의 의견 from FB
5개의 의견 from SLiPP
하드코딩하지 않는 이유 중 하나는 '의미'를 살려서 코드에 대한 이해를 높이는 것이라 생각하는데, 이런 측면에서 URL 경로를 다른 파일에 상수로 넣는 것은 현재 코드를 읽는데 도움이 되지 않는다고 생각합니다. 불필요한 코드 참조를 유발할 것 같네요.
Router.servlet("/group/create"), Router.urlPatterns(CreateGroupServlet.class) 요런게 되면 좋을텐데.
극단적으로 보자면 소스코드의 중복일듯 합니다. 위의 경우가 모두를 대변하지는 않겠지만 굳이 GROUP_CREATE = "/group/create";과같이 똑같은 단어를 내포하고 있는 값을 다시 그 와 같은 단어의 변수명으로 대체를 해야할 필요가 있을지는 잘 모르겠네요. Convention Of Configuration 같이 관례적인 설정을 다시 할필요가 있을지?에 대한 의문이 드네요
GROUP_CREATE : 이것도 그룹을 만드는 것으로 이해가 되고, "/group/create" : 이것도 그룹을 만드는 것으로 이해가 되는데 굳이 다시 변수를 써야 할 필요는 없을듯 합니다. 물론 중복적인 URL이 나와서 WebServletURL.GROUP_CREATE + WebServletURL.GROUP_CREATE_SUB_GROUP 같이 쓴다고 할 수도 있겠지만 저것도 굳이 낳아 보이지는 않습니다.
개인적인 의견이지만 명시적인 convention이라면 굳이 다시 Wrapping하지 않는걸 좀더 선호합니다.
빼지 않는게 낫다는 의견이 많운데 저는 반대 의견을 제시해봅니다.
만약 추후에 mapping url을 group이 아닌 groups로 하자고 변경이 되었을 때, 모든 서블릿을 찾아서 수정하는 것보다 한 곳에서 수정할 수 있다는 이점이 있습니다.
두번째로는 서블릿의 종류가 많아질 때 각 서블릿에 해당하는 URL을 한눈에 파악할 수 있어서 행여나 겹쳐서 작성할 실수를 미연에 방지할 수 있습니다.
단점은 각 서블릿을 볼 때 맵핑된 URL 주소를 바로 볼 수 없어서 확인 절차를 통해 한번더 들여다보는 수고는 필요합니다.. ㅠ
코딩을 배울 때 나중 일을 미리 생각해서 작성하지 말라고 배웠지만. 이런 부분에서는 어느정도의 장치가 필요하다고 생각합니다.
@장영빈 매핑 URL을 한 곳에서 파악할 수 있다는 것이 의미가 있을 수도 있겠네. 한 곳으로 모음으로써 얻어지는 장점과 각 서블릿으로 분리하는 방법의 장점은 어느 장점이 더 클까? 앞의 댓글에서 중복이라고 표현한 부분에 대해서는 어떻게 생각해?
Convention Of Configuration(이하 CoC)와 관련한 이야기도 있는데 이건 또 어떤 방식으로 처리하는 방식을 의미하는 것일까?
의견을 남기기 위해서는 SLiPP 계정이 필요합니다.
안심하세요! 회원가입/로그인 후에도 작성하시던 내용은 안전하게 보존됩니다.
SLiPP 계정으로 로그인하세요.
또는, SNS 계정으로 로그인하세요.