Java 개발자라면 한 번쯤은 이런 고민을 해봤을 것입니다
"멀티 스레드 환경이니깐 문자열 결합할 때 무조건
StringBuffer
를 써야 할까?"
결론부터 말하면, Spring Boot 서버 환경에서도 지역 변수로 문자열을 처리할 때는 **StringBuilder**
를 사용해도 전혀 문제가 없습니다
이러한 특징 때문에 "멀티 스레드는 무조건 StringBuffer"라고 생각 할 수 있습니다
하지만, 모든 멀티스레드 환경에서 StringBuffer
를 사용할 필요는 없습니다
Spring Boot는 기본적으로 멀티 스레드 환경입니다
하지만 메서드 내 지역 변수는 스택 메모리에 할당되므로 각 스레드마다 별도로 생성되고 관리됩니다
따라서 지역 변수는 각 스레드별로 고유한 메모리 공간을 갖게 되어 동기화가 필요 없습니다
@Service
public class ExampleService {
public String concatStrings() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100; i++) {
sb.append("문자열").append(i).append(" ");
}
return sb.toString();
}
}
위 코드에서 StringBuilder
는 메서드 내에서만 지역적으로 사용되며,
각 요청은 독립적인 스레드에서 처리됩니다
따라서 여러 스레드가 동시에 같은 StringBuilder
인스턴스에 접근하는 상황은 절대 발생하지 않습니다
만약 여기에 굳이 StringBuffer
를 사용한다면, 불필요한 동기화로 인해 성능 손실만 발생할 뿐입니다
StringBuilder
를 쓰는 것이 좋습니다StringBuffer
혹은 명시적 동기화를 사용해야합니다