Frudy
7k
2019-06-05 10:02:57 작성 2019-06-05 10:21:49 수정됨
11
1274

게시판 중복코드 줄이기 (문자열)


안녕하세요.


포트폴리오에 올릴 게시판을 만들면서,

문자열에 대한 중복코드를 줄인 경험을 공유하고자합니다.


제 경험이 다른분들께 도움이 되었으면 좋겠습니다.


꼭 게시판이 아니여도,

Java의 String타입을 사용하는 모든 프로젝트에서 적용이 가능합니다.


ㅡㅡㅡ


문자열을 변수로 관리한다.


예전에 이 말을 잘 이해 못했습니다.

msg.setText("잘못된 입력입니다."); 이거를 굳이


public static final String INVALID_INPUT_MESSAGE = "잘못된 입력입니다.";

msg.setText(INVALID)INPUT_MESSAGE); 이렇게 하는 이유요.


이번 프로젝트하며 직접 겪어보며, 제가 느낀

문자열을 변수로 관리하는 방법은 다음과 같습니다.


>> 여기저기서 공통적으로 사용해야하는 문자열은 반드시 변수에 저장해야한다.


[처음 버전]

return "/help/faq.do"; 이렇게 한다던가,

modelAndView.setViewName("/help/faq.do"); 이렇게 한다던가,

jsp페이지 혹은 controller 매핑경로를 반환하는 코드가 있었습니다.


[문제점]

그래서 중복코드가 되게 심했습니다.

로그인페이지 딱 하나만 생각해봐도,


1. 내 문의내역페이지 접근 --> 로그인안되어있음 --> 로그인페이지 이동

2. 문의하기 페이지 접근 --> 로그인안되어있음 --> 로그인페이지 이동

이런식으로, 로그인페이지에 접근하는 경우가 되게많았는대,


이게 모두 "/help/loginForm.do" 이렇게 되어있었습니다.


즉, loginForm으로 가는 경로가 바뀌면,

저의경우 최소 20군데는 넘게 수정을 해야했습니다.


심지어, 로그인안되어있어서 로그인페이지갔다가, 로그인성공하면

이전페이지로 다시 보내야 해서.. previousPage라는 패러미터로 또 페이지를 넘겨야 했기 때문에,


정말 페이지경로 문자열의 중복이 심했습니다.


그래서 모두 이렇게 변수에 저장하고 관리하기 시작했습니다.


왜 굳이 static final로 설정했는지는,

https://djkeh.github.io/articles/Why-should-final-member-variables-be-conventionally-static-in-Java-kor/

여기 글을 보고 배웠습니다.


꼭 jsp파일경로가 아니여도, 문자열을 사용하는 어떠한 경우라도

똑같은 문자열을 사용한다면,

저는 앞으로 변수에 담으려고 합니다.


ㅡㅡ


이외에도, 예외처리 했던 경험 이라던가,

계산된 or 계산해야하는 값을 자료구조에 저장해야한다던가 하는

기타 저만의 코딩스탠다드가 몇개 더 있습니다만,


뉴비가 만들어서 지키는 규칙이다보니 신빙성이 떨어져서,

커뮤니티에 올려볼지 말지는 고민중입니다.


게시판 혼자 만드느라 1달 되가는데,

꼭 좋은곳 취업하고싶습니다....

0
  • 댓글 11

  • 개발자학도
    2k
    2019-06-05 10:13:15 작성 2019-06-05 10:16:23 수정됨

    getParameter  null처리나 어제글쓰신 넘버포멧익셉션 같은 처리도 

    공통클레스로 빼버리고 해당클레스만 불러와서 쓰는 것도 같은이유죠


    참고러 요새 개인정보가 중요시되어서 XSS 스크립트 공격같은것도 정규식사용해서 replace 시켜야되기때문에 공통클레스 사용잘하는게 중요하죠 

  • 캐츠비
    1k
    2019-06-05 10:16:59

    좋은방법이죠 ㅎㅎ 저는

    뷰단은 Spring message 액션태그를 이용해서 프로퍼티로 정의하는방법이 있고,

    백단에서는 Enum을 이용해서 정의합니다. ㅎㅎ

  • 개발자학도
    2k
    2019-06-05 10:25:51

    jsp단에서

    Stirng var1="";

    if(request.getParameter("key")==null){

     var1="";

    }else{

     var1=request.getParameter("key")

    }


    이런식으로 변수하나하나마다 조건문을걸어 입력하면 코드가 더러워지니 

    class를 하나를 만들어서 

    String var1=CommonUtil.checkNull(request.getParameter("key"));

    이렇게 한줄로 처리가능하도록 만들자는 취지죠 제가드리고싶은말은 ㅎㅎ 

  • minarai
    2k
    2019-06-05 10:32:20

    저도 경로 상수로 관리하는편인데 나름 괜찮은 것 같아요

    현장에서는 서버에 고정으로 박히는 경로들은 다 자바 상수로 해놓는데
    개발자가 임포트해서 테스트,확인해야하는 경로들은 프로퍼티로 끌어와서 관리하고 있습니다.

    자바에서 끌어다 쓸때는 resourceBundle기능을 이용하고 있구요
    프로퍼티로 쓰면 좋은점이 경로 수정할 일 있으면 서버에 배포할때 클래스파일 재생성 하지 않아도
    그냥 프로퍼티만 수정하고 서버 리로드만 하면 적용되서 편한 것 같아요


  • 개발자학도
    2k
    2019-06-05 10:37:10 작성 2019-06-05 10:37:58 수정됨

    Frudy 

    사용자에게  에러페이지를 보여주는건 좋은방법이 아닙니다

    null일경우 공백값을주거나 꼭 필요한 값인경우는 메세지를 return시키거나 

    그외 크리티컬한 에러는 에러시 별도의 에러페이지를 만들어 뿌려주는게 좋습니다


    참고러 톰캣같은경우는 에러메세지를 뿌려줄때 톰캣버전까지 포함되서 나오거나 에러부분 소스를 그대로 노출시키는 경우도있기때문에

    악의적인 맘을 품은사람들이 해당 톰캣버전의 취약점을 분석해서 공격할수도있기때문에 보안상으로도 별로 바람직 하진않죠 

  • 개발자학도
    2k
    2019-06-05 10:46:24 작성 2019-06-05 10:49:29 수정됨

    Frudy 

    ㅎㅎ 500에러를 보여준다는 글에서 헷갈렸네요

    에러처리를 별도로한다는건 잘한거죠 


    추가로 만드시는김에 기본적인 보안코드도 공통클레스로 만들어서 사용해보십시요

    XSS공격이나 injection 공격 방지 정규식은 구글링 해보면 쉽게나오니

    요새 개인정보보호 이슈가 강한편이라 신입 포트폴리오에 저런기본적인 공격방지 소스가있음

    가산점이 좀 있지않을까 조심스럽게 생각을 ㅎㅎ 

  • 포로리잉
    775
    2019-06-05 11:19:46

    스프링을 쓰면 보통..

    runtimeException같은 처리안해줘도 되는 익셉션으로 던져서 ExceptionHandler에서 통으로 처리하는게

    편할때가 많아서..

  • 배우고싶은이
    734
    2019-06-05 11:22:07

    public static final --> 상수라고 배웠습니다.

    컴파일러가 컴파일시에 치환 -> 정적메모리에 올라가지 않음이라고 알고 있습니다.


    잘못 알고 있는걸까요?


    어째든 그래서 좋습니다.


    제가 이상하게 생각하는 것은 private static final 입니다. 

    의외로 이렇게 한정자 적는 분이 많더군요.. 쓸데없이 static 메모리 낭비라고 생각하는데 아닌가요?

  • 배우고싶은이
    734
    2019-06-05 11:45:26

    static 영역에 메모리 잡히면 gc가 비우지 않는걸로 알고 있습니다. 즉 vm 종료시까지 유지.. 그래서 그렇게 말씀드린겁니다. 근데.. 제가 정확히 알고 있는건진또 모르겠네요..

    어째든 전 그렇게 알고 있습니다.


    static 한정자를 붙이지 않으면 일반적으로 객체가 더이상 사용치 않을 경우 gc에서 제거대상이되어 메모리 해제 되는 걸로 알고 있습니다.


    누구라도 제가 잘못 알고 있다면 말씀해주시면 좋겠네요.

  • 배우고싶은이
    734
    2019-06-05 13:41:32

    private을 쓰면 다른 클래스에서 접근이 안되죠. 짜로 getter, setter의 pubillc 함수를 만들지 않고서는요.


    private인데 static 이다?

    혼자쓰는데 정적메모리에 올린다?

    모르겠네요. private static final도 컴파일러가 상수치환해서 바이트코드로 만들어주는지는.



  • 포포핀
    746
    2019-06-05 18:01:18

    static으로 선언된 변수는 application이 종료되기 전까지 메모리에 남아있기 때문에 

    무분별하게 마구 쓰면 static영역 메모리가 부족해질 수도 있습니다.

    그렇게 때문에 자주 사용되는 변수라면 static 변수로 선언하는게 유용할테고

    자주사용하지 않는 변수를 static으로 선언한다면 비효율적이겠죠

    자바에서 사용되지 않는 불필요한 객체가 GC의 대상이 되지 않으면 memory leak 이 발생됐다고 하기때문에

    static 변수가 거의 사용되지 않는다면  memory leak 이라고도 볼 수 있을거 같습니다.

  • 로그인을 하시면 댓글을 등록할 수 있습니다.