이상민 님의 [자바 성능 튜닝 이야기](이상민 님의 https://book.interpark.com/product/BookDisplay.do?_method=detail&sc.prdNo=213341056&gclid=EAIaIQobChMI4I-A2K_I9gIVhzMqCh1dMQ7hEAQYASABEgIlH_D_BwE) 참고
1장. 디자인 패턴은 꼭 써야 한다.
디자인 패턴이란?
- 전체 클래스 중 의미있는 클래스들을 묶은 각각의 집합
- 반복되는 의미있는 집합을 정의하고, 이름을 지정한 후 동일한 의미의 패턴으로써 다른 사람들과 공유할 수 있도록 만들어 놓은 것
MVC 패턴
Model, view, Controller 역할을 각기 나누어 Class 를 생성하고 개발하는 Model 방식
JSP 모델
- 주로 Model1과 Model2 방식을 사용한다.
Model1
- 뷰와 로직을 모두 JSP 페이지 하나에서 처리하는 구조
- JSP Model1 은 JSP 에서 Java Bean을 호출하고 DB에서 정보를조회, 등록, 수정 삭제 CRUD 작업을 처리한 후 그 결과를 브라우저로 보내주는 방식
- 과거에 사용
- 장점
- 단점
- 개발 완료후 로직이나 프로세스를 변경하기가 어렵다. 하나의 JSP 파일 안에 비즈니스 로직이나 프로세스에 대한 코드가 모두 적혀 있기 때문
- 화면과 비즈니스 모델의 분업화가 어려워 개발자 역략ㅇ에 따라 구현 코드가 많이 달라질 수 있다.
Model2
- Model1 방식의 단점을 해결하기 위해 나온 것이 JSP Model2
- MVC 모델 준수, Servlet 을 통해 요청을 처리한다. → Servlet 이 컨트롤러 역할
- 유지보수가 용이하고, 코드가 복잡하다.
- 따라서 MVC 와 같은 형태를 가지고 있다.
- Model → 서비스 클래스, 자바 빈
- View → JSP 페이지
- Controller → 서블릿
J2EE 패턴
Intercepting Filter 패턴
- 요청 타입에 따라 다른 처리를 하기 위한 패턴
Front Controller 패턴
- 요청 전후에 처리하기 위한 컨트롤러를 지정하는 패턴
View Helper 패턴
- 프리젠테이션 로직과 상관 없는 비즈니스 로직을 헬퍼로 지정하는 패턴
Composite View 패턴
- 최소 단위의 하위 컴포넌트를 분리하여 화면을 구성하는 패턴
Service to Worker 패턴
- Front Controller와 View Helper 사이에 디스패처를 두어 조합하는 패턴
Dispatcher View 패턴
- Front Contrller와 View Helper 로 디스패치 컴포넌트를 형성한다. 뷰 처리가 종료될 때까지 다른 활동을 지연한다는 점이 Service to Worker 와 다르다.
Business Delegate 패턴
Service Locator 패턴
- 서비스와 컴포넌트 검색을 쉽게 하는패턴
EJB
, EJB Home 객체
나 DB의 DataSource를 Look up, 즉 찾을 때 소요되는 응답 속도 감소를 위해 사용
Session Facade 패턴
- 비즈니스 티어 컴포넌트를 캡슐화하고, 원격 클라이언트에서 접근할 수 있는 서비스를 제공하는 패턴
Composite Entity 패턴
- 로컬 엔티티 빈과 POJO를 이용하여 큰 단위의 엔티티 객체 구현
Transfer Object 패턴
- 로컬 엔티티 빈과 POJO를 이용하여 큰 단위의 엔티티 객체를 구현
- 흔히 VO(Value Object) 라는 전송 객체 데이터를 전송하기 위한 디자인 패턴
- DTO vs VO
- DTO ( Data Transfer Object) 는 계층간 데이터 교환을 위한 자바빈즈. 로직을 가지고 있지 않는 객체이고 getter, setter 메소드만 가지고 있다. 또한 setter 를 사용할 수 있는 가변 속성이다.
- VO (Value Object) 는 값 오브젝트로써 자바는 값 타입을 표현하기 위해 불변 클래스를 만들어 사용하는 데 불변이라는 read Only 특징을 가진다.
Transfer Object Assembler 패턴
- 하나의 Transfer Object 로 모든 데이터를 처리할수 없으므로, 여러 Transfer Object 를 조합하거나 변형한 객체를 생성하여 사용하는 패턴
Value List Handler 패턴
- 데이터 조회를 처리하고, 결과를 임시 저장하며, 결과 집합을 검색하여 필요한 항목을 선택하는 역할을 수행
Data Access Object 패턴
- 일명 DAO, DB 에 접근을 전달하는 클래스
- Connection 까지 설정되어 있는 경우가 많아서 Mybatis 를 사용할 경우 DAO 를 별도로 만드는 경우는 드물다.
Service Activator 패턴
2장. 내가 만든 프로그램의 속도를 알고 싶다.
비싼 성능 프로그램 말고도작성한 프로그램의 성능을 알 수 있는 방법을 알아보자
- 시스템 분석 툴
- 프로파일링 툴은 개발자용 툴이다. 소스 레벨의 분석을 할 수 있고 애플리케이션의 세부 응답 시간까지 분석할 수 있다. 또한 메모리 사용량을 클래스, 소스의 라인 단위까지 분석할 수 있다.
- 사용자 수 기반으로 가격이 정해진다.
- 자바 기반 클라이언트 분석가능 → Scouter
제공하는 기능
- 응답 시간 프로파일 기능
- 하나의 클래스 내에서 사용되는 메서드 단위의 응답 시간을 측정한다.
- 툴에 따라서 소스 라인 단위로 응답 속도를 측정할 수도 있다.
- 보통 CPU 시간과, 대기시간 이렇게 2가지 제공한다.
- CPU 시간 : CPU를 점유한 시간을 의미
- 대기 시간 : CPU를 점유하지 않고 대기한 시간
- 메모리 프로파일링
- 잠깐 사용하고 GC의 대상이 되는 부분을 찾는다.
- 메모리 부족현상이 발생하는 부분을 찾는다.
- 애플리케이션 자애 상황에 대한 모니터링 및 문제점 진단이 주목적
- 서버의 사용자 수나 리소스에 대한 모니터링 할 수 있고, 실시간 모니터링을 위한 툴이다.
- CPU 수를 기반으로 가격이 정해진다.
- 자바 기반의 클라이언트 분석 불가능 → newrelic
System 클래스
- System Class Method 는 Static 으로 되어있고, 그 안에 생성된 in, out, err 객체들도 static 으로 선언 가능하다.
- 유용한 메소드
- static void arrayCopy(Object src, int srcPos, Object dest, int destPos, int length)
Property(속성) vs Environment(환경)
- Property : JVM에서 지정된 값
- env : 장비에 지정된 값
- 유용한 메서드
- static Map<String, String> getenv()
- 현재 환경 변수 값을 String 형태의 맵으로 리턴
- static void load(String fileName);
- 파일명을 지정하여 Native Library를 로딩
- static void loadLibrary(String libName)
- Library 이름을 지정하여 Native Library 를 로딩
작성금지 Methods
- System Class 에서 운영 중인 코드에 절대 사용해서는 안되는 메소드
- static void gc()
- 자바에서 사용하는 메모리를 명시적으로 해제하도록 GC를 수행하는 메소드
- static void exit(int status)
- static void runFinalization()
- 오브젝트 객체에 있는 finalize() 라는 메소드는 자동으로 호출되는데, GC가 알아서 해당 객체를 참조할 필요가 없을때 호출
- 이 메소드를직접 호출하면 참조 해제 작업을 기다리는 모든 객체의 finalize() 메소드를 일일히 수동으로 수행해야 한다.