본문 바로가기

개발

Effective Java ( 이펙티브 자바 ) - 11장 (동시성) - 아이템 78 공유 중인 가변 데이터는 동기화해 사용하라 synchronized 키워드는 해당 메서드나 블록을 한번에 한 스레드씩 수행하도록 보장한다. 많은 프로그래머가 동기화를 배타적 실행, 막는 용도로만 생각한다. 동기화를 제대로 사용하면 어떤 메서드도 이 객체의 상태가 일관되지 않은 순간을 볼 수 없을 것이다. 맞는 설명이지만, 동기화에는 중요한 기능이 하나 더 있다. 동기화 없이는 한 스레드가 만든 변화를 다른 스레드에서 확인하지 못할 수 있다. 동기화는 일관성이 깨진 상태를 볼 수 없게 하는 것은 물론, 동기화된 메서드나 블록에 들어간 스레드가 같은 락의 보호하에 수행된 모든 이전 수정의 최종 결과를 보게 해준다. 언어 명세상 long과 double 외의 변수를 읽고 쓰는 동작은 원자적이다. 이 말을 듣고 '.. 더보기
[강의 정리] 우아한모노리스(2) - 우아한테크세미나 간단한 코드 예제 위와 같은 흐름으로 커머스의 예를 들어본다. 도메인 중심으로 응집도 높은 모듈 구성하기 도메인 주도 설계의 관점으로 보인다. 도메인은 SW가 해결하고자 하는 문제. 서비스 영역이라고도 하고. 결국 이 시스템은 고객이 상품을 보고, 주문하고, 배송할 수 있는 기능을 제공해야 한다. 그 경계를 따라서 모듈을 구성할 것이다. 도메인이라는 것을 생각할 때, 함께 생각하면 좋은 도구 중에 하나가 DDD에서 언급하는 전략적 설계방법중 하나인 바운디드 컨텍스트다. 도메인의 경계를 찾아갈 수 있는 도움을 준다. 모듈화에서 쓸 수 있는 기법이 2가지 정도 있다. 계층 구조로 모듈화 가장 흔하게 볼 수 있는 구조 계층을 기준으로 모듈화를 하기 시작하면, 시스템이 커지면 계층 내부의 복잡도가 올라간다. 새.. 더보기
[강의 정리] 우아한모노리스(1) - 우아한테크세미나 좋은 강의들을 보고, 정리해보고자 한다. 첫 번째로 "우아한테크세미나에서 발표된 박용권님의 우아한모노리스"를 정리해 본다. 영상링크는 다음과 같다. https://www.youtube.com/watch?v=SrQeIz3gXZg 모노리스 -> 마이크로서비스로 넘어가면서 찢어진 두 개이상의 시스템을 어떻게 통합할까? 라는 관점에서 "이벤트" 기반을 도입해보았다. 반대로 MSA를 모노리스로 옮기는 과정도 경험해 보았다. 시장에는 아키텍처 이야기를 다루는 책이 많지 않다. 하지만 MSA는 조금 예외다. 서점에 책이 너무 많다. 하지만 보편적인 서버 아키텍처, 모노리스에 대한 책은 잘 없다. MSA책 안에 몇 장이 나올 뿐. 모노리스에 있는 이야기를 들려주는 강의! 우린 마이크로서비스에서 모노리틱으로 갈아탔다. .. 더보기
서버 아키텍처에 대한 고민과 조언 정리 가상 면접 사레로 배우는 대규모 시스템 설계 기초 헥사곤 아키텍처(포트앤어댑터 패턴), 클린아키텍처 회사 내 규모있는 프로젝트 구조 공부 책에 있는 내용 따라하다가 이도저도 안되는 경우가 많다. 프로젝트들 현실과 타협한 구조 우아한 모노리스, 우아한 멀티모듈, 이벤트 기반 분산 시스템을 향한 여정, ddd lite@spring - 유튜브 영상 클린아키텍처 - 로버트 c 마틴 도메인 주도 설계 핵심 - 반 버논 오브젝트 - 조영호 도메인 주도 설계로 시작하는 마이크로 서비스 개발 Building Event-Driven Microservices - 아담 벨레마르 객체지향, ddd, 클린아키텍처(어니언), 헥사고날 아키텍처, cqrs, 이벤트드리븐 순서 추천 saga msa 키워드로 유튜브 검색 엔터프라이즈 .. 더보기
Effective Java ( 이펙티브 자바 ) - 아이템 77 예외를 무시하지 말라 API 설계자의 목소리를 흘려버리지말자. 예외를 명시하는 까닭은 적절한 조치를 취해달라고 말하는 것이다. 안타깝게도 예외를 무시하기란 아주 쉽다. 해당 메서드 호출을 try문으로 감싼 후 catch 블록에서 아무일도 하지 않으면 끝이다. catch 블록을 비워두면 예외가 존재할 이유가 없어진다. 그럼에도 불구하고 어쨌든 예외를 무시하기로 했다면(간혹 무시해야 할 때도 있다 - FileInputStream) catch 블록 안에 그렇게 결정한 이유를 주석으로 남기고 예외 변수의 이름도 ignored로 바꿔놓도록 하자. 예외를 적절히 처리하면 오류를 완전히 피할 수도 있다. 무시하지 않고 바깥으로 전파되게만 놔둬도 최소한 디버깅 정보를 남긴 채 프로그램이 신속히 중단되게는 할 수 있다. 더보기
Effective Java ( 이펙티브 자바 ) - 아이템 76 가능한 한 실패 원자적으로 만들라 호출된 메서드가 실패하더라도 해당 객체는 메서드 호출 전 상태를 유지해야 한다. 이러한 특성을 실패 원자적이라고 한다. 메서드를 실패 원자적으로 만드는 방법은 다양하다. 가장 간단한 방법은 불변 객체로 설계하는 것이다. 흔한 방법은 작업 수행에 앞서 매개변수의 유효성을 검사하는 것이다. 내부 상태 변경 전에 잠재적 예외의 가능성 대부분을 걸러낼 수 있는 방법이다. public Object pop() { if (size == 0) throw new EmptyStackException(); Object result = elements[--size]; elements[size] = null; // 다 쓴 참조 해제 return result; } 처음의 if 문에서 size 값.. 더보기
Effective Java ( 이펙티브 자바 ) - 아이템 75 예외의 상세 메시지에 실패 관련 정보를 담으라 예외를 잡지 못해 프로그램이 실패하면 자바 시스템은 그 예외의 스택 추적 정보를 자동으로 출력한다. 스택 추적은 예외 객체의 toString 메서드를 호출해 얻는 문자열이다. 이 정보가 실패 원인을 분석해야 하는 프로그래머 혹은 SRE가 얻을 수 있는 유일한 정보인 경우가 많다. 따라서 toString 메서드에 실패 원인에 관한 정보를 가능한 한 많이 담아 반환하는 일은 아주 중요하다. 사후 분석을 위하여. 실패 순간을 포착하려면 발생한 예외에 관여된 모든 매개변수와 필드의 값을 실패 메시지에 담아야 한다. IndexOutOfBoundsException의 상세 메시지는 범위의 최솟값, 최댓값, 그리고 그 범위를 벗어났다는 인덱스의 값을 담아야 한다. 하지만 .. 더보기
Effective Java ( 이펙티브 자바 ) - 아이템 74 메서드가 던지는 모든 예외를 문서화하라 메서드가 던지는 예외는 그 메서드를 올바로 사용하는 데 아주 중요한 정보다. 따라서 예외 하나하나를 문서화하는 데 충분한 시간을 쏟아야 한다. 검사 예외는 항상 따로따로 선언하고, 각 예외가 발생하는 상황을 자바독의 @throws 태그를 사용하여 정확히 문서화하자. 공통 상위 클래스 하나로 뭉뚱그려 선언하는 일은 삼가자(Exception, Throwable). 이 규칙에 유일한 예외가 있다면 바로 main 메서드다. main은 오직 JVM만이 호출하므로 Exception을 던지도록 선언해도 괜찮다. 자바 언어가 요구하는 것은 아니지만 비검사 예외도 정성껏 문서화해두면 좋다. 일반적으로 프로그래밍 오류를 뜻하는데, 프로그래머가 자연스럽게 해당 오류가 나지 않도록 코딩.. 더보기