전체 글

패턴과 아키텍처는 잘 구성되어 있는가?너무 많은 패턴을 사용하지 않았는가?너무 많은 패턴을 적용하면 유지보수성이 떨어지고, 문제가 발생했을 때 추적하기가 어려워진다.좋은 패턴이라고 무작정 적용하기보다는 꼭 필요한 패턴만을 사용해야 한다.데이터를 리턴할 때 TO(혹은 VO) 패턴을 사용하였는가? 아니면 Collection 관련 클래스를 사용하였는가?데이터를 주고 받는 시간을 절약하기 위해서 일반적으로 TO 패턴을 사용한다.그리고 때에 따라서는 Collection 관련 클래스를 사용하기도 한다.이러한 패턴을 적용하지 않았거나 관련 표준을 정하지 않고 개발을 할 경우 시스템의 응답 시간도 영향이 있겠지만, 유지 보수성이 떨어진다.게다가 HashMap으로 데이터를 주고 받으면, 소스를 완전히 뜯어 보지 않는 이..
암달의 법칙1 Core에서 20시간 소요되는 작업 중 1시간은 절대 개선할 수 없다면, 20배 이상의 성능 향상은 불가능성능 개선율1/((1-P) + P/S)P는 개선 가능한 부분의 비율 / 개선 가능한 부분이 100% => 1S는 개선된 정도 / 2배의 성능 향상이 이루어 졌다면 S = 2  성능 튜닝 step by step원인 파악어디가 병목인지 확실히 파악목표 설정성능 개선뿐만 아니라, 향후 유지보수까지 모두 고려해서 목표를 설정튜닝 실시코드를 최적화하며 튜닝개선율 확인결과가 만족스럽지 않은 경우에는 '튜닝 실시' 단계록 다시 넘어가서 진행결과 정리 및 반영되도록 꼭 필요한 사항들만 정리  성능 튜닝의 비법하나만 보지 말아라병목의 대상대상세부 대상서버 장비CPU, Network, Disk, Memo..
대상 찾기상위 20%의 화면을 분석 및 튜닝 대상으로 선정기존 시스템 모니터링 툴의 통계 기능을 사용하여 찾기기존 시스템의 웹 로그를 분석하기 예시구분화면명초기 화면로그인원무환자 접수 신청진료환자조회처방전 지정치료 일수 입력처방 내림외래 기록지 저장원무수납 조회수납 처리CASE1안내원은 환자의 이름을 '김'으로만 조회했다그런데 시스템의 응답이 없어서 안내원은 계속 검색 버튼을 누르기 시작했다안내원이 검색을 누른 후부터 해당 애플리케이션이 DB의 CPU 대부분을 점유했고DB쿼리의 문제로 오픈이 연기되었다CASE2한 시스템이 매일 14~16시 사이에만 다운되는 현상이 있어 진단이 시스템은 내부용 시스템이 아니라 대외로 오픈된 시스템임시스템의 로그 분석을 해서 하나의 화면이 한 시간에 10만 번 이상 호출되는..
자바의 Runtime data areaPC 레지스터JVM 스택힙(Heap) => GC 발생메서드 영역런타임 상수(constant) 풀네이티브 메서드 스택Class Loader Subsystem클래스나 인터페이스르 JVM으로 로딩하는 기능을 수행 Execution Engine로딩된 크래스의 메서드들에 포함되어 있는 모든 인스트럭션 정보를 실행  Heap 메모리클래스 인스턴스, 배열공유(shared) 메모리여러 스레드에서 공유하는 데이터들이 저장 Non-heap 메모리Method Area메서드 영역은 모든 JVM 스레드에서 공유한다.Java Stacks스레드가 시작할 때 JVM 스택이 생성된다.메서드가 호출되는 정보인 프레임(frame)이 저장된다.지역 변수와 임시 결과, 메서드 수행과 리턴에 관련된 정보들..
HotSpot VMSun에서 만든 성능 개선을 위한 JIT(Just In Time) 컴파일러 (HotSpot)프로그램의 성능에 영향을 주는 지점에 대해 지속적으로 분석 VM 런타임JIT 컴파일러메모리 관리자 JIT OptimizerJIT 애플리케이션에서 각각의 메서드를 컴파일할 만큼 시간적 여유가 많지 않음따라서 모든 코드는 초기에 인터프리터에 의해서 시작되고해당 코드가 충분히 많이 사용될 경우에 컴파일할 대상이 된다HotSpot Vm에서는 메서드에 있는 두 개의 카운터에 의해 통제수행 카운터메서드를 시작할 때마다 증가CompileThreshold : 한계칙벡에지 카운터높은 바이트 코드 인덱스에서 낮은 인덱스 컨트롤 흐름이 변경될 때마다 증가메서드가 루프가 존재하는지를 확인카운터들이 인터프리터에 의해 증..
아파치 웹 서버의 설정MPM 사용 (Multi-Processing-Module)여러 개의 프로세싱 모듈 기반의 서비스를 제공httpd.confThreadsPerChild 250웹 서버가 사용하는 스레드의 개수 지정만약 이 수치가 적게 지정되어 있다면, 이 수치를 늘려 주어야 함그래야 서버가 더 많은 사용자의 요청을 처리할 수 있음MaxRequestsPerChild 0 최대 요청 개수를 지정0이면 그 수에 제한을 두지 않겠다가급적 기본값인 0으로 할 것"Include conf/extr/httpd-mpm.conf" 주석 해제세밀한 스레드 설정 정보를 지정할 수 있게 됌 httpd-mpm.confStartServers 2서버를 띄울 때 프로세스의 개수를 지정한다MaxClients 150최대 처리 가능한 클라이..
JSP 라이프 사이클JSP URL 호출페이지 번역JSP 페이지 컴파일클래스 로드인스턴스 생성jspInit 메서드 호출_jspService 메서드 호출jspDestroy 메서드 호출 JSP 적절한 include 사용하기정적인 방식: JSP의 라이프 사이클 중 JSP 페이지 번역 및 컴파일 단계에서 필요한 JSP를 읽어서 메인 JSP의 자바 소스 및 클래스에 포함 시키는 방식동적인 방식: 페이지가 호출될 때마다 지정된 페이지를 불러들여서 수행느림따라서 막 쓰지 말고 상황에 맞는 include 방식을 사용해야 함 서블릿 라이프 사이클Servlet 객체가 자동으로 생성되고 초기화 되거나사용자가 해당 Servlet을 처음으로 호출했을 때 생성되고 초기화 된다.그 다음 계속 '사용 가능' 상태로 대기한다중간에 예외..
결론 : 로그를 System.out으로 찍지 말아라 필요 로그를 클래스로 관리하는 방법public clas SimpleLogger { pricate static final boolean printFlag=false; public static void log(String message) { if (printFlag) { logger.info(message); } }}public class Logger { final Logger logger = LoggerFactory.getLogger(Logger.class); Integer t; Integer oldT; public void setTemperature(Integer temperature) { ..
· Spring/MVC
HTTP 메서드 매핑 PathVariable(경로 변수)URL 경로에 동일한 패턴의 가변 값을 받아서 처리하기 위할 때 사용/** * PathVariable 사용 * 변수명이 같으면 생략 가능 * @PathVariable("userId") String userId -> @PathVariable String userId */@GetMapping("/mapping/{userId}")public String mappingPath(@PathVariable("userId") String data) { log.info("mappingPath userId={}", data); return "ok";}  특정 조건 매핑파라미터헤더미디어 타입 조건 매핑 - HTTP 요청 Content-Type, consume미디어 타입..
· Spring/MVC
FrontController vs 스프링 MVCFrontController => DispatcherServlethandlerMappingMap => HandlerMappingMyHandlerAdatper => HandlerMappingModelView => ModelAndViewviewResolver => ViewResolverMyView => View  DispatcherServlet부모 클래스에서 HttpServlet을 상속 받아서 사용, 서블릿으로 동작DispatcherServlet => FrameworkServlet => HttpServletBean => HttpServlet스프링 부트는 DispatcherServlet을 서블릿으로 자동으로 등록모든 경로(urlPatterns="/")에 대해서 매..
· Spring/MVC
V1 구조public class MemberControllerV1 implements ControllerV1 { @Override public void process(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException { String viewPath = "/WEB-INF/views/new-form.jsp"; RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath); dispatcher.forward(request, response); }}@WebServlet(name = "frontControllerServlet..
· Spring/MVC
개요너무 많은 역할하나의 서블릿이나 JSP만으로 비즈니스 로직과 뷰 렌더링까지 모두 처리하는 문제점너무 많은 역할 담당유지보수 어려워짐 변경의 라이프 사이클내부와 외부의 라이프 사이클이 다름UI 수정과 비즈니스 로직 수정은 각각 다르게 발생할 가능성이 매우 높음대부분 서로 영향을 주지 않는다분리되어 있기 때문에 함께 관리하는 것은 좋지 않다 기능 특화뷰 테플릿은 화면을 렌더링 하는데 최적화 되어 있기 때문에 분리하여 담당하는 것이 효과적이다 Model View Controller컨트롤러HTTP 요청을 받아서 파라미터를 검증하고, 비즈니스 로직을 실행한다. 그리고 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다모델뷰에 출력할 데이터를 담아둔다.뷰가 필요한 데이터를 모두 모델에 담아서 전달해주기에 뷰는 비..
류가든
장난감정원