안녕하세요 스프링 초보 질문드립니다..!!
쓰레드 세이프 하지않은 클래스를 빈으로 등록하고, ( 예를 들어 simpledateformat 클래스같은)
@autowired로 DI 한다음
@Transactional 이 선언된 서비스단에서 해당 클래스를 사용하면
쓰레드 세이프가 보장 될 수 있나요??
보장이 된다면 제가 말씀드린 방식으로도 현업에서 사용하시는지도 궁금합니다...
(아니면 그냥 쌩으료 new 연산자로 호출해서 사용하는지..
그렇게 사용된다면 메모리 부하 같은 문제는 없는지... 궁금합니다.)
가르침을 주시면 정말 정말 감사하겠습니다....!!!
Transactional이랑 스레드랑 관련이 없는데
김대기 일해라!
윗댓처럼 DB단 트랜잭션 격리때문에 쓰는거지 객체관련 널세이프와 상관없음.
아 저는 널 세이프가 아니라 멀티 스레드 환경에서 스레드 세이프 하지 않은 클래스는 어떻게 활용하나 그 점이 궁금했습니다! 트랜잭션이 원자적으로 실행되니까 쓰레드 세이프 하지 않은 클래스도 @Transactional 어노테이션 영향 하에 원자적으로 실행되어 쓰레드 세이프 하게 동작되지 않을까 그 점이 궁금했었는데 그런 트랜잭션의 원자적 실행이 쓰레드 세이프 하지 않은 클래스에는 영향이 없는걸까요??
트랜잭셔널 어노테이션은 그냥 DB단 트래잭션 걸어주는 코드 추상화시켜놓은거라 상관없을거임. 보통 DI시켜놓으면 디폴트가 싱글톤인데 스프링 자체적으로 널세이프하게 생성하는걸로 알고있는데 오개념일 확률 90프로니 스프링 빈스코프관련해서 검색해보는거 추천함.
네 감사합니다 ^^ 그럼 서비스단에서 @Transactional의 영향을 받는 코드는 DAO와 관련된 코드뿐이라고 이해해도 괜찮을까요??
예스
답변 주셔서 정말감사합니다!! :)
몇몇 특수한 상황이 아니라면 쓰레드 세이프하지 않을거 같은데 db가 어떻게 락을 거는지 더 공부해보셈 - dc App
저는 @Transactional이 임계영역을 설정하는것과 비슷한 효과가 있는지 궁금했는데, 그럼 서비스단에서 사용된 객체가 DAO인지 아닌지 스프링 내부에서 자체적으로 구별해서 DAO 객체만 트랙잭션의 영향을 받는걸까요?
예를 들어서 @Transactional에서 update를 한다고 쳐보자 그러면 MySQL같은 경우는 테이블 전체에 락을 걸지 않고 행마다 락을 걸거든?(정확히는 인덱스로 검색한게 락이 걸림) 쉽게 말해서 다른 행을 업데이트하면 동시에 실행이 가능하다는 소리고 문제가 생길수있지
제가 이해를 못한건지.. 제가 여쭤보는 이야기랑 조금 다른 이슈에 대한 답변이신거 같은데.. 어쨌든 알려주셔서 정말 감사합니다!! ^^ mysql에서 행마다 락을 거는건 처음 알았네요. 하나 배워갑니다 :)
음.. 원자성이랑 동시성이랑은 별로 상관이 없는거고 아마 DB에서 락 거는거랑 원자성이랑 뭔가 혼동한듯?
근데 객체가 threadsafe 하다 아니다는, 그 객체의 상태값을 여러 스레드가 동시접근해서 read하는 와중에 상태값을 조작할 때 발생하는 문제 아닌가? 여러 쓰레드가 동시접근 해도 모두 read만 한다면 상관없지 않나? 근데 simpledateformat 같은 애는 날짜,시간을 read하는 용도로 쓰지, 여기에 상태를 저장하고 변경하는 용도로 안쓰니까 예시가 잘못된거 아닌가?
그리고 만약 예시가 simpledateformat 이 아닌 다른 뭐 도메일 객체(ex. item)를 @Bean 붙여서 서비스에서 DI로 주입받고 쓰는데 여러 쓰레드들이 item.quantity에 동시접근해서 값을 변경하려고 하면 음.. POJO는 synchronized 처리해야하는게 확실한데 @Bean 붙였다고 동시성 처리 해줄지 의문이네. 근데 @Bean 붙이면 spring ioc에 singleton으로 등록된다는데, singleton 객체 안에 필드값들은 아마 synchronized 처리 되지 않았을까? 왜냐면 만들어지는 객체가 단 하나이고, 스프링은 멀티쓰레드 환경에서 돌아간다는걸 전제하고 만들어진 프레임워크니까, 당연히 내부적으로 synchronized 처리를 했겠지? (아닐수도?) 그러니 될거임 아
그렇게 생각해볼수도 있겠네요 답변주셔서 감사합니다 :)