목록개발 서적 (19)
csct3434
애그리거트도메인 객체 모델이 복잡해지면 개별 구성요소 위주로 모델을 이해하게 되고 전반적인 구조나 큰 수준에서 도메인 간의 관계를 파악하기 어려워진다. 주요 도메인 요소 간의 관계를 파악하기 어렵다는 것은 코드를 변경하고 확장하는 것이 어려워진다는 것을 의미한다. 이때 상위 수준에서 모델을 정리하면 도메인 모델의 복잡한 관계를 이해하는데 도움이 된다. 상위 수준에서 모델이 어떻게 엮여 있는지 알아야 전체 모델을 망가뜨리지 않으면서 추가 요구사항을 모델에 반영할 수 있다.상위 수준에서 모델을 조망할 수 있는 방법이 바로 애그리거트다.한 애그리거트에 속한 객체는 유사하거나 동일한 라이프 사이클을 갖는다.한 애그리거트에 속한 객체는 다른 애그리거트에 속하지 않는다.애그리거트는 독립된 객체 군이며 각 애그리거트..
네 개의 영역표현 영역 (Presentation)표현 영역은 사용자의 요청을 받아 응용 영역에 전달하고 응용 영역의 처리 결고를 다시 사용자에게 보여주는 역할을 한다.웹 애플리케이션의 표현 영역은 HTTP 요청을 응용 영역이 필요로 하는 형식으로 변환해서 응용 영역에 전달하고, 응용 영역의 응답을 HTTP 응답으로 변환하여 전송한다.예를 들어 표현 영역은 웹 브라우저가 HTTP 요청 파라미터로 전송한 데이터를 응용 서비스가 요구하는 형식의 객체 타입으로 변환해서 전달하고, 응용 서비스가 리턴한 결과를 JSON 형식으로 변환해서 HTTP 응답으로 웹 브라우저에 전송한다.응용 영역 (Application)public class CancelOrderService { @Transactional pub..
도메인이란?도메인 : 소프트웨어로 해결하고자 하는 문제 영역한 도메인은 여러 하위 도메인으로 구성된다 (ex : 온라인 서점 - 회원, 주문, 카탈로그, 리뷰, 혜택, 배송, 결제, 정산)한 하위 도메인은 다른 하위 도메인과 연동하여 완전한 기능을 제공한다. (ex : 고객이 물건을 구매하면 주문-혜택-결제-배송 하위 도메인의 기능이 엮이게 됨)요구사항의 이해요구사항 분석 및 설계는 개발에 있어서 첫 단추 (Garbage In, Garbage Out)개발과 관련된 도메인 전문가, 관계자, 개발자가 같은 지식을 공유하고 직접 소통할수록 도메인 전문가가 원하는 제품을 만들 가능성이 높아짐개발자와 각 도메인의 전문가가 직접 대화해야 정보가 왜곡되고 손실되는 것을 방지할 수 있음도메인 전문가 만큼은 아니더라도 ..
IO어떤 디바이스를 통해서 이루어 지는 모든 작업을 IO라고 한다IO는 성능에 영향을 가장 많이 미치는 부분이다.자바에서 IO는 스트림을 통해서 이루어진다주요 클래스클래스명용도ByteArrayInputStream바이트로 구성된 배열을 읽어서 입력 스트림을 만든다.FileInputStream이미지와 같은 바이너리 기반의 파일 스트림을 만든다.FilterInputStream여러 종류의 유용한 입력 스트림의 추상 클래스이다.ObjectInputStreamObjectOutputStream을 통해서 저장한 객체를 읽기 위한 스트림을 만든다.PipedInputStreamPipedOutputStream을 통해서 출력된 스트림을 읽어서 처리하기 위한 스트림을 만든다.SequenceInputStream별개인 두 개의 스..
자바에서 스레드는 어떻게 사용하나?Thread 클래스와 Runnable 인터페이스스레드의 구현은 Thread 클래스를 상속받는 방법과 Runnable 인터페이스를 구현하는 방법 두 가지가 있다.기본적으로 Thread 클래스는 Runnable 인터페이스를 구현한 것이기 때문에 어느 것을 사용해도 거의 차이가 없다.자바는 다중 상속을 허용하지 않기 때문에, Thread 외에 상속받을 클래스가 존재한다면 Runnable 인터페이스를 구현해야 한다.public class RunnableImpl implements Runnable { @Override public void run() { System.out.println("This is RunnableImpl."); }}public c..
06. Staticstatic 잘 활용하기자주 사용하고 절대 변하지 않는 변수는 final static으로 선언하자설정 파일 정보는 static으로 관리하자코드성 데이터는 DB에서 한 번만 읽자static 잘못 쓰면 이렇게 된다static 변수를 여러 곳에서 수정하는 경우 동시성 문제가 발생한다static으로 선언된 Collection 객체는 GC의 대상이 아니기 때문에, 계속해서 데이터가 쌓일 경우 OutOfMemoryError가 발생할 수 있다정리static은 원리를 알고 잘 사용하면 시스템의 성능을 향상시킬 수 있다하지만 잘못사용하면 돌이킬 수 없는 일, 시스템이 다운되거나 예기치 못한 결과가 발생할 수 있다static은 반드시 메모리에 올라가며 GC의 대상이 되지 않는다만약 static을 사용하는..
if문대상응답 시간 (마이크로초)if 0개 * 1000회0.46if 10개 * 1000회5if 100개 * 1000회63경유하는 if문의 개수를 달리하여 동일한 작업을 처리하는데 소요되는 시간을 측정한 결과이다. if문 10,000회를 실행하는데 4.54 마이크로초가 소요되었고, 100,000회를 수행하는데 62.54 마이크로초가 소요되었다. if문을 1회 실행하는데 0.4 ~ 0.6 나노초가 소요된 것으로, 아주 큰 성능 저하가 발생한다고 보기는 어렵다.switch문switch문도 if문과 마찬가지로 빠른 응답 결과가 나온다.JDK 7부터 String 문자열을 switch문에 사용할 수 있는데, 이는 컴파일러가 문자열을 hashCode() 메서드의 반환값으로 처리하기 때문이다. 자바 컴파일러는 각 문자..
Collection 및 Map 인터페이스 구성Set 인터페이스HashSet : 데이터를 해쉬 테이블에 담는 클래스로 순서 없이 저장된다.LinkedHashSet : 데이터를 해쉬 테이블에 담는 클래스로 저장된 순서에 따라서 순서가 결정된다.TreeSet : 데이터를 Red-Black 트리에 담는 클래스로 내부적으로 정렬이 수행된다.데이터 추가 성능 비교 : "data1", "data2", ... , "data1000" 순차 추가대상평균 응답 시간 (마이크로초)HashSet375LinkedHashSet378TreeSet1,249HashSet과 LinkdHashSet의 성능은 비슷하고, TreeSet은 내부적으로 정렬이 수행되어 상대적으로 느린 성능을 보인다.HashSet의 크기를 미리 지정한 경우대상평균 ..
StringBuilder 클래스와 StringBuffer 클래스StringBuilder와 StringBuffer가 제공하는 메서드는 동일StringBuffer는 ThreadSafe하게 설계되어 있으므로 여러 스레드에서 객체를 공유할 때 사용StringBuilder는 단일 스레드에서의 안정성만 보장하므로 여러 스레드에서 공유할 경우 동시성 문제가 발생String vs StringBuffer vs StringBuilder package org.example;public class Main { private static final String value = "abcde"; private void testString() { String a = new String(); for ..
APM 툴 VS 프로파일링 툴프로파일링 툴소스 레벨의 분석을 위한 툴애플리케이션의 세부 응답시간까지 분석 가능메모리 사용량을 객체, 클래스, 소스 라인 단위까지 분석 가능자바 기반의 클라이언트 프로그램 분석 가능개발자용 툴주로 느린 메서드 및 클래스를 찾는 것을 목적으로 사용APM 툴애플리케이션의 장애 상황에 대한 모니터링 및 문제점 진단이 주 목적서버의 사용자 수나 리소스에 대한 모니터링 가능실시간 모니터링을 위한 툴자바 기반의 클라이언트 프로그램 분석 불가능운영 환경용 툴목적에 따라 용도가 상이 (어떤 APM 툴은 문제점 진단에 강한 반면, 다른 APM 툴은 시스템 모니터링 및 운영에 강함)프로파일링 툴의 기능응답 시간 프로파일링 기능하나의 클래스 내에서 사용되는 메서드 단위의 응답 시간을 측정 (툴..