1. 톰캣 1,2단계 미션 리뷰 반영해서 제출했다.
https://github.com/woowacourse/jwp-dashboard-http/pull/341
Optional
이번 미션에는 Map이 참 많이 등장한다.
그러다 보니 map.get()연산이 자주 발생하는데 이로 인해 null체크가 빈번하게 필요하다.
처음에는 급해서 그냥 if (어쩌고 == null) 이런식으로 해놨는데, 코드에 null이라는 단어가 등장하는 것 자체가 마음에 들지 않았다.
그런데 마침 리뷰어 하디가 `Optional`을 사용하는 것이 어떻냐는 제안을 했고!
그 주제로 다른 크루들과 대화를 나눠봤다.
- 크루들의 의견은 'Optional의 isEmpty()', '그냥 반환하고 == null', '호출 전에 hasValue()로 확인', 'getOrDefault 사용' 요 네가지 방법으로 나눠지더라.
- Optional의 장점
- 메소드의 반환값이 Optional이면 해당 메소드를 쓰는 다른 개발자도 '아 이 반환값은 null일수도 있구나~'를 알고 적절히 핸들링 할 수 있다. (명시적)
- isEmpty는 그냥 말그대로 '조회된 값이 없다' 정도의 의미를 가지지만
null은 어플리케이션에 예상치 못한 문제가 발생했음을 나타낸다.
- String은 ""일 경우 .isEmpty에 true길래 String 반환하는 애들은 optional말고 .getOrDefault( ,"");로 했다.
2. 구구의 [ThreadTest : stage0]을 했다.
해당 내용 조만간 정리해야겠다.
3. 구구의 [ThreadTest : stage1]을 했다.
Check-Then-Act 상황 : 이전에 검증(Check) 한 결과가 행동(Act) 시점에는 더 이상 유효하지 않을때 발생하는 문제
검증 시점에는 true, 행동 시점에는 false
(검증시점에서는 users가 gugu를 가지고 있지 않았지만, 행동시점에서는 users가 이미 gugu를 가지고 있음 -> gugu 중복 add)
<왜 브레이크 포인트 찍어야 문제 상황이 발생할까?>
그냥 돌리면 race condition 자연적으로 발생하기 어려움 (100번 돌리면 몇번은 발생하겠지)
그냥 돌리면 앵간하면 두 스레드가 동시에 실행될 확률 낮다.
디버거 찍으면 먼저 돌던 애가 멈춤
-> 그 사이에 다른 스레드도 들어옴
-> 다음으로 넘어가는 순간 둘이 동시에 진입
원래는 1스레드 돌고 2스레드 돌고 앵간하면 이런식으로 순서대로 실행되는데
1스레드가 디버거에 붙들려있는 동안 2스레드가 도착해버려서
다음으로 넘어가는순간 둘이 동시에 진입