-
2021.07.17 기록장TIL 2021. 7. 16. 23:54
ToDo
- 알고리즘 2문제
- 책 읽기
- 토비의 스프링
- 북마크 쳐내기
Done
- 토비의 스프링
- 알고리즘 2문제
Weekly goal
- 책 읽기
- 토비 스프링 코딩
- 플젝?
컨트리뷰터를 등록할 예정이다. 근데 c#은 학부 때 말고 해 본 적이 없어서 고민이긴 한데 뭐 좋은 기회가 될 것 같아서 신청하려 한다.
토비의 스프링
잠깐 스프링 빈에 대해 이야기해보자면 스프링 빈의 스코프는 싱글톤이다. 빈은 ioc 컨테이너에서 관리하는데 우리가 알고 있는 일반적인 싱글톤 패턴과는 좀 다르다. 싱글톤 패턴은 상속이 불가능하고, 테스트가 힘들다. 또 서버 환경에서는 하나만 만들어지는 것을 보장할 수 없다(jvm이 분산되어 설치될 수 있기에).
그래서 스프링은 직접 싱글톤 형태의 싱글톤 레지스트리를 만들고 관리한다. 서버 환경에서 빈은 상태를 가지고 있지 않은 무상태성을 유지하는 것이 좋다. 여러 군데에서 사용하면 덮어써지기에.
저번에 공부했던 빈 스코프를 직접 실습을 해봤다. 스프링 빈의 스코프는 싱글톤이므로.
매번 new를 하는 것처럼 보이지만 빈의 스코프는 싱글톤이고 싱글톤 레지스트리로서 관리하고 있기에 같은 id가 반환되어야 한다.
근데 매번 호출 때마다 다른 빈을 받고 싶다면 스코프를 프로토 타입으로 가지면 된다.
다른 스코프 중에는 요청 스코프, 세션 스코프 등이 있다.
트랜젝션
토비의 스프링에서 트랜젝션에 관해 나와서 다시 공부했다.
트랜젝션은 ACID를 지원해야 한다.
원자성: 트랜젝션은 나눌 수 없는 작업들로 이뤄져야 한다. allOrNoting
일관성: 트랜젝션이 이뤄지기 전에 DB가 정상이었듯이 트랜젝션이 끝나도 정상이어야 한다. ex) 돈이 빠져나간 계좌와 더해진 계좌의 금액은 일정해야 한다.
고립성: 트랜젝션은 다른 트랜젝션에 관여할 수 없다. 관여하면 뭐 값이 틀어지니까.
지속정: 트랜젝션이 끝나면 그 정보는 영속된다.
고립성에 대해 저번에 책에서 봤다.
트랜젝션은 병행으로 실행이 된다. 근데 같은 정보에 접근하거나 문제를 일으킬 수 있으니 병행 제어 기법을 사용한다.
병행 제어 기법으로 자주 사용되는 것은 락킹 방법이다. 트랜젝션이 데이터에 접근할 때 락을 걸고 사용을 마치면 락을 푸는 것이다. 락을 걸어도 read는 할 수 있게 하는 공용 락과 read write를 모두 풀어주는 전용락이 있다.
그런데 락을 너무 일찍 풀게 되어 일관성이 깨지는 것을 막기 위해 2단계 로킹 규약이 존재한다.
특정 시점에 모든 락을 걸게 시키고 그 이후는 락을 못 거는 것이다(확장). 언락도 특정 시점에만 거는 것이다.(축소)
2단계 로킹 규약을 적용하면 직렬 가능성을 보장할 수 있다. 근데 교착 상태가 발생할 수 있다.
트랜젝션에서 교착상태까지 가는데.. 교착상태의 해결법으로는 교착상태가 일어나지 않게 예방하거나 발생했을 때 빨리 탐지해서 필요한 조치를 취해야 한다.
'TIL' 카테고리의 다른 글
2021.07.19 기록장 (0) 2021.07.18 2021.07.18 기록장 (0) 2021.07.17 2021.07.16 기록장 (0) 2021.07.15 2021.07.15 기록장 (0) 2021.07.14 2021.07.14 기록장 (0) 2021.07.13