Reference/Effective-Java

    [Effective-Java] Chapter11 #78. 공유 중인 가변 데이터는 동기화해 사용하라

    💡 여러 Thread가 가변 데이터를 공유한다면 그 데이터를 읽고 쓰는 동작은 반드시 동기화하라 📌 synchronized 키워드 Thread Synchronization : Multi-thread 환경에서 하나의 공유자원에 여러 thread가 동시에 접근하는 것을 막는 것 Critical Section : 공유 데이터가 사용되어 Synchronization이 필요한 부분 Java에서는 ciritical section에 synchronized 키워드를 활용하면 된다. 더보기 ✒️ Synchronized 블럭 synchronized(락 객체) { //임계 영역 (Thread 동시접근이 불가능) } 코드의 가독성 측면에선 좋으나, 성능 면에선 별로다. 지정된 객체는 critical section의 공유를 지..

    [Effective-Java] Chapter10 #77. 예외를 무시하지 말라

    📌 예외를 무시하는 방법 try { ... } catch (SomeException e) { // 아무것도 안 하면 예외가 무시된다. } catch 블록을 비워두면 예외가 존재할 이유가 없어진다. 화재 경보를 무시하는 수준이 아니라 그냥 꺼버린 거나 다름없다. 빈 catch 문을 보거든 당신의 머릿속의 사이렌🚨이 돌아가야 한다. ('어떤 놈이 한 짓이지..?') API 설계자가 메서드 선언에 예외를 명시한 까닭은, 적절한 조치를 취해달라고 말하는 것이다. 📌 부적절한 예외 처리 1️⃣ 예외 블랙홀 (1) try { // 예외가 발생할 수 있는 코드 } catch(~Exception e) { } 2️⃣ 예외 블랙홀 (2) try { // 예외가 발생할 수 있는 코드 } catch(~Exception e) ..

    [Effective-Java] Chapter10 #76. 가능한 한 실패 원자적으로 만들라

    📌 실패 원자적(failure-atomic) 💡 호출된 메서드가 실패하더라도 해당 객체는 메서드 호출 전 상태를 유지해야 한다 대충 트랜잭션의 ACID와 같은 이야기를 하는 거 같다. 1️⃣ 불변 객체(Item 217)로 설계하는 방법 public class String { ... public String substring(int beginIndex, int endIndex) { int length = length(); checkBoundsBeginEnd(beginIndex, endIndex, length); int subLen = endIndex - beginIndex; if (beginIndex == 0 && endIndex == length) { return this; } return isLatin..

    [Effective-Java] Chapter10 #75. 예외의 상세 메시지에 실패 관련 정보를 담으라

    이번 주제는 자바 라이브러리에서 권장하기 보단, 책의 저자가 권장하는 방식에 대한 이야기다. 📌 스택 추적(stack trace) 예외 객체의 toString 메서드를 호출해 얻은 문자열 일반적으로 예외 클래스 이름 뒤에 상세 메시지가 붙는 형태 프로그래머 혹은 신뢰성 엔지니어(SRE; Site Reliability Engineer)가 실패 원인을 분석하기 위한 유일한 정보인 경우가 많다. 실패를 재현하기 힘든 경우, 더 자세한 정보를 얻기가 어렵거나 불가능하다. toString 메서드에 실패 원인에 관한 정보를 가능한 한 많이 담아야 한다. 📌 예외 상세 메시지에 담겨야 하는 정보 💡 스택 추적 정보는 많은 사람이 볼 수 있으므로 비밀번호나 암호 키 같은 보안 정보는 담지 마라 예외에 관여된 모든 매개..