Java프로그래밍

자바 전역변수를 사용하면 안되는 이유는?

최근 프로젝트에서 C++로 개발된 Pro*c를 자바로 변환 하는 작업을 하고 있다.  5,000라인이 넘는 코드를 자바로 변환하는데 VO를 만들기 귀찮아서 Controller 클래스에서  전역변수로 전부 선언하고 사용하였다.

사실 자바로 개발하면서 전역변수를 사용할일이 없는데 C++로 구현된 AS-IS코드를 그대로 자바로 만드는 과정에서 빨리 개발하기 위해 사용하였다.

그런데 문득 다른 개발자들이 얘기하는 걸 들었는데 전역변수를 쓰면 안된다는 것이고, 만약에 걸리면 코드를 수정해야한다는 것이다.

전역변수를 써서 개발한 경우는 대학교 다닐때 그렇게 했었고 그 이후에는 그럴일이 없었기에 쓰면 안되는 이유를 알지 못했다.  이 바닥에 13년이나 있었는데 부끄러워해야하는 일일까?

왜 사용하면 안되는지 구글 검색을 해보았고 다음과 같은 질문과 답변들을 보았다.

VO를 안만들고 데이터를 전역변수에 다 넣으면 안좋나요?

답변1 : 여러명이 동시에 사용하면 값이 뒤섞여서 지옥을 맛보실 수 있지요.


답변 2: 전역 변수에 유저의 요청 값을 넣어서 처리한다고 했을 시, 1번 유저가 완전히 작업이 끝나면 2번 유저의 요청을 받아 전역변수에 값을 세팅하여 처리한다고 치면,
서버의 성능이 저하될 뿐 문제 될 건 없습니다. (서버 성능 저하 자체가 문제가 됨)

자, 그럼 여기서 궁금증을 가져봅시다. 우리가 쓰고 있는 WAS 는 멀티 쓰레드일까? 싱글 쓰레드일까?
각 요청당 무한으로 쓰레드가 생겨날까? 어떻게 될까? 성능을 끌어올리려면 어떻게 해야 할까?

위에 질문들이 궁금하면 찾아보시길 바라고..
다시 질문으로 돌아와 하나의 요청당, 하나의 스레드가 생성된다는 가정을 해봅시다.

1번 유저가 전역변수에 값을 세팅하고 있는데,
2번 유저의 요청 쓰레드가 갑자기 먼저 치고 들어와서 전역변수를 값을 써버립니다.
그리고 1번 유저가 작업을 하려고 값을 꺼내보니..어? 내가 세팅한 값이 아니네?

그래서 전역변수의 값이 꼬이게 됩니다.

그래서 보통 전역변수는 “상수”로 사용하고 값을 READ 하는 경우에만 사용되죠.

이 질문이 참 재밌는게..간단히 생각해볼 수도 있지만 자세히 파고 들어가다보면 꼬리에 꼬리를 물게 되는 질문이기도 합니다.

라떼시절에는 Tomcat 은 싱글스레드인가 멀티스레드인가? 라는 질문을 항상 하곤 했었는데..
대부분 면접자들은 답을 못했죠..

갑자기 이 말을 왜 하냐면요..

이 질문에 대한 답을 명확하게 하려면, WAS의 동작방식과 쓰레드에 대해서 명확하게 이해가 가능 할 때 할 수 있는 답입니다.

“그냥 전역변수에 쓰면 데이터가 꼬여” 라는건 사실 답이 아닙니다.

왜냐면 PHP라는 환경에서는 그렇게 해도 되거든요..
PHP라는 환경은 왜 그게 될까? 라고 접근해보면 또 재밌기도 합니다.

화이팅입니다 🙂

어찌되었든 나는 전역변수를 모두 VO를 만들어서 담아서 처리하는 방식으로 전역변수를 제거했다.

이곳 프로젝트 코딩 규칙상 HaspMap 사용도 하면 안된다는 곳이다.

error: Content is protected !!