Java

[java]클래스가 상태값을 갖는다.

오개발 2024. 10. 6. 17:06

클래스에 상태값을 가지고 있는다는게 상황에 따라 고려해야된다.

 

먼저 상태를 가지고 있는 코드를 아래와 같다.

해당 코드에서 상태를 확인하는건 speed 이다 

 

상태를 가지는 것이 좋은 이유중에 가장 좋은건 객체의 고유한 상태를 가지고 있고 그 상태에 기반한 행동을 수행할 때 의미가 있습니다.

 

현실상태에서도 각각의 객체(사물)의 상태를 알수 있습니다, 예를 들어 컴퓨터의 상태, 의자의 상태 다양하게 객체들간의 상태값을 가지고 있습니다. 이 처럼 프로그래밍적으로도 객체의 상태값을 가지고 있으면 좋습니다. 

하지만 대규모 트래픽에선 좋지 않은 방법이다.

 

즉 class에 대한 상태값을 가지고 있는게 안 좋다.

 

먼저 해당 상태로 테스트 코드를 작성하였다.

 

위에 대한 코드는 32개의 스레드가 1000번 실행 했을때 즉 멀티 스레딩을 했을때 어떤 값이 나올지 테스트를 하였다.

 

 

 

결과값은 993번, 998번 계속 실행하면 가끔 확률적으로 1000이 나왔다.

 

당연히 트래픽이 얼마 없는 구간에선 문제없이 해결할수 있겠지만, 매우 불안정적이고 유실될 가능성이 크다. 

손쉽게 해결할수 있는 방법으로 자바에서 해결할수 있다.

 

1. Synchronizod 사용 

 

자바에서 손쉽게 사용 할수 있게 하나의 스레드만 특정 메서드나 블록에 접근할 수 있도록 동기화 할수 있습니다.

하지만 동기화는 성능에 영향을 미칠 수 있고 잠금을 너무 자주 발생하면 병목 현상을 발생 시킬수도 있습니다.

 

 2. Atomic 사용하기

 

등등 있지만 각각의 클래스 인스턴스가 아닌 다른 방식으로 가지고 있는것이 좋다.

 

1. 외부 저장소 방식 ( 데이터베이스 , Redis, Memcached 등등 )

2. 세션 관리 방식

3. 클라우드 상태 관리 서비스 방식

 

결론

Java에서 클래스가 상태를 갖는 것은 애플리케이션의 설계와 성능에 중요한 영향을 미칩니다. 상태 관리의 장점과 단점을 잘 이해하고, 상황에 맞는 설계를 선택하는 것이 중요합니다. 동기화와 같은 기술을 통해 멀티스레드 환경에서 발생할 수 있는 문제를 효과적으로 해결할 수 있습니다. 결국, 상태 관리에 대한 올바른 접근은 안정적이고 효율적인 소프트웨어 개발의 핵심입니다.