자바 성능 튜닝 이야기 1,2

bo-yoon·2022년 3월 15일
0

Java performance

목록 보기
1/1

이상민 님의 [자바 성능 튜닝 이야기](이상민 님의 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장. 내가 만든 프로그램의 속도를 알고 싶다.

비싼 성능 프로그램 말고도작성한 프로그램의 성능을 알 수 있는 방법을 알아보자

Profiling Tool

  • 시스템 분석 툴
  • 프로파일링 툴은 개발자용 툴이다. 소스 레벨의 분석을 할 수 있고 애플리케이션의 세부 응답 시간까지 분석할 수 있다. 또한 메모리 사용량을 클래스, 소스의 라인 단위까지 분석할 수 있다.
  • 사용자 수 기반으로 가격이 정해진다.
  • 자바 기반 클라이언트 분석가능 → Scouter

제공하는 기능

  1. 응답 시간 프로파일 기능
    • 하나의 클래스 내에서 사용되는 메서드 단위의 응답 시간을 측정한다.
    • 툴에 따라서 소스 라인 단위로 응답 속도를 측정할 수도 있다.
    • 보통 CPU 시간과, 대기시간 이렇게 2가지 제공한다.
      • CPU 시간 : CPU를 점유한 시간을 의미
      • 대기 시간 : CPU를 점유하지 않고 대기한 시간
  2. 메모리 프로파일링
    • 잠깐 사용하고 GC의 대상이 되는 부분을 찾는다.
    • 메모리 부족현상이 발생하는 부분을 찾는다.

APM Tool

  • 애플리케이션 자애 상황에 대한 모니터링 및 문제점 진단이 주목적
  • 서버의 사용자 수나 리소스에 대한 모니터링 할 수 있고, 실시간 모니터링을 위한 툴이다.
  • 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)
      • 현재 수행중인 JAVA VM 을 멈춘다
    • static void runFinalization()
      • 오브젝트 객체에 있는 finalize() 라는 메소드는 자동으로 호출되는데, GC가 알아서 해당 객체를 참조할 필요가 없을때 호출
      • 이 메소드를직접 호출하면 참조 해제 작업을 기다리는 모든 객체의 finalize() 메소드를 일일히 수동으로 수행해야 한다.
profile
개발 로그 🍎 🍎 🍎

0개의 댓글