반응형

Spring 에서 Bean 으로 등록할 수 있는 @Bean, @Component, @Controller, @Service, @Repository 등 어노테이션들은 그 구현 클래스 내부에 변수를 생성해서는 안 된다. Bean 객체들은 기본 정책 상 싱글톤 객체이기 때문에 그렇다.

 

서로 다른 요청에 따라 쓰레드 별로 스택 메모리 영역을 차지한다고 하더라도, 이미 힙 영역에 Bean 객체가 로딩되어 그 로딩된 객체를 공유하기 때문에 상태 변수가 내부에 있다면 그 상태 변수가 의도하지 않은 상태로 실행이 될 수 있다.

 

따라서, Bean 객체는 메소드만 공유해야 하며, Bean 객체의 상태값을 유지하게 만드는 필드 값이 없는 무상태(Stateless)로 설계해야한다.

 

그런데 직접 설계해보니 결국 스프링은 대량의 요청을 받는 프레임워크이기 때문에 공유하는 오브젝트가 있을 수도 있다. 예를 들어 해당 요청의 서비스를 해야할지 말아야 할지 결정하는 전역변수 같은 경우이다. 되도록이면 사용하지 말아야 겠지만...

 

그 대신 레이스 컨디션이 되지 않도록 multi-thread 환경에 안전한 자료구조와 알고리즘을 사용하자.

 

참고

[스프링] 싱글톤 방식의 주의점 - 스프링 빈은 항상 무상태(stateless)로 설계하자 (tistory.com)

반응형

'JAVA > Spring' 카테고리의 다른 글

[Spring Boot] Auto-Configuration  (0) 2022.09.23
반응형

Spring Boot 에서는 Spring 모듈들의 설정들을 자동으로 셋팅해주어 일일히 구현하지 않더라도 빠르게 사용할 수 있다.

이를 Auto-Configuration 이라고 한다. 예를 들어, 서버의 IP 나 포트 설정 정보 등을 받기 위해 클래스를 구현하고 외부 파일에서 값을 받아와 셋팅을 해야 하는데 이러한 절차를 각자 코딩하여 셋팅하면 설정 파일들도 중구난방이 되고 유지보수 하기가 불편해진다. 다행히도 Spring Boot 에서는 외부에서 값을 설정할 수 있는 방법을 통일했다.

 

Spring Boot 가 애플리케이션을 구동할 때 자동으로 로딩하여 참조하는 파일이 applicatioin.properties 이다.

이 application.properties 에 정의된 형식에 맞게 key 와 value 를 셋팅하면, @Value("${변수 이름}") 어노테이션으로 가져와서 사용할 수 있다. 그런데 내가 작성한 프로퍼티가 아니라 써드 파티 모듈의 프로퍼티라면 이야기가 달라진다.

 

모듈이기 때문에 현재 프로젝트의 application.properties 파일에 정의되어 있지도 않고, 공식 문서도 옛날 것이라면 어디서 이러한 정보를 찾아야 될까? 정답은 아래 spring-projects/spring-boot 프로젝트 github 소스코드를 직접 살펴보아야 한다.

 

써드 파티 모듈에서 application.properties 설정 값 찾는 방법

 

spring-boot/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure at main · spring-projects/spring-boot (github.com)

 

GitHub - spring-projects/spring-boot: Spring Boot

Spring Boot. Contribute to spring-projects/spring-boot development by creating an account on GitHub.

github.com

 

예를 들어, rsocket 관련 spring boot 설정 값들을 보고 싶다면, 위 github 에서 rsocket 관련 소스코드를 찾아 @ConfigurationProperties 어노테이션이 선언된 클래스를 확인하면 된다.

 

 

@ConfigurationProperties(" 속성 이름 ") 에서 첫 번째 속성을 찾고, 클래스 내부에 변수들을 콤마 뒤에 붙여 설정 값을 기입하면 된다. 이 예제에서는 @NestedConfigurationProperty 어노테이션이 추가로 붙어 있으므로 두 번째 속성을 기입해야 Server 클래스 내부의 변수들을 설정 값으로 사용할 수 있다. 사용 방법은 아래와 같다.

 

spring.rsocket.server.port = Integer 형식

spring.rsocket.server.address = InetAddress 형식

spring.rsocket.server.transport = RSocketServer.Transport 형식

spring.rsocket.server.mappingPath = String 형식

반응형

'JAVA > Spring' 카테고리의 다른 글

[Spring] Bean 내부에는 변수를 생성해서는 안 된다.  (0) 2022.10.04

+ Recent posts