요새 새로운 API를 개발할 때 node.js로 개발하는 비율이 점점 늘어나는 것 같습니다. 저도 node.js를 접해가면서 "다들 노드 쓰니까 나도 써야지" 가 아닌 개발자스럽게 "노드는 이런 장점이 있으니 이런 상황에 적절한 솔루션이 되겠군" 이라는 생각으로 접근해보고자 생각했던 내용을 정리해보았습니다. 1. Blocking / Non-Blocking IO자바의 Blocking IO자바는 IO가 일어날 때마다 스레드가 블록상태가 됩니다. IO는 파일읽기/쓰기 네트워크통신 등의 입출력 행위를 말합니다. 간단한 예로는 데이터베이스로의 CRUD 작업이 있습니다.스레드가 블록상태가 되면 그 스레드는 작업불가 상태이기 때문에 CPU를 사용하지 못합니다. 만약 웹의 상황이라면 하나의 요청을 끝까지 처리한 후에야..
Connection Pool의 사용 보통 데이터베이스를 연결해 값을 받아올 때 가장 오래걸리는 부분은DriverManager.getConnection() 메소드로 Connection 객체를 얻는 부분이다. WAS와 DB는 통신을 해야하기 때문이다.특히 DB서버가 따로 분리되어 있을 때 소요되는 시간은 더욱 증가한다. 이러한 부분에서 DB서버와 연결하는 대기시간을 줄이고, 네트워크의 부담을줄이기 위해 Connection Pool을 사용해야한다. 요즘 프레임워크에는 보통 Connection Pool이 구비되어 있다. PreparedStatement의 사용 Statement는 PreparedStatement를 사용하는 것이 좋다.일반 Statement를 사용하면 쿼리문장분석, 컴파일, 실행의 단계를 매번 거치..
IO에서 발생하는 시간은 CPU의 대기시간에 속하기 때문에 성능에 가장 큰 영향을 끼친다. IO를 효율적으로 사용하기 위해서는 1. 버퍼를 잘 사용하자BufferedReader 등 버퍼를 사용하는 클래스들도 있다.잘 보고 사용하자 2. 요청이 발생할 때마다 파일을 읽어선 안됀다.모든 요청이 올 때마다 파일을 읽도록 한다면 엄청난 IO가 발생할 것이고 이는 성능의 저하를 야기한다.또한 병목현상이 발생할 확률도 높다.보통 DB의 쿼리나 여러 설정들을 파일에 저장하고 사용하는 경우가 많은데이 경우 이 파일들을 미리 읽어놓고 사용하는 것이 좋으며, 수정될 때마다 어플리케이션을 재시작하는 것이 번거롭다면, 별도의 스레드를 생성하여 5~10분 주기로 수정여부를 확인해주는 것도 좋다. 예를 들어보자면 mybatis ..
Synchronized의 정의 하나의 객체에 여러 요청이 동시에 들어오면 연산이 꼬여 이상한 결과가 나올 수 있다.그래서 synchronized 를 선언하여 동기화를 시켜 한번에 한 요청씩 들어오도록 줄을 세우는 것이다. Synchronized를 사용해야 할 때 1. 하나의 객체를 여러 스레드에서 동시에 사용할 경우2. static으로 사용하는 객체를 여러 스레드에서 동시에 사용할 경우 이 외의 경우에 synchronized를 사용하면 대부분 성능에 영향을 미치므로꼭 필요한 경우가 아니면 사용하지 않도록 하자.
static을 잘 사용하면 성능을 향상시킬 수 있지만, 잘못 사용하면 더 느려지거나, 오류가 생기고, 최악의 경우엔 JVM이 죽어버릴 수 있다. static은 여러 JVM에서는 다른 주소나 값을 참조하지만, 같은 JVM이나 WAS에서는 같은 주소를 참조하고, GC의 대상이 되질 않기 때문에 잘못 사용하면 성능을 하락시킬 수 있다. 특히 웹에서는 하나의 static 변수에 여러 스레드가 접근할 수 있으므로 주의해야한다. Static을 잘 사용하기 위해서는 1. 자주 사용하고 절대 변하지 않는 변수는 final static으로 선언한다. 특히 자주 사용하는 쿼리들이나 간단한 목록조회 쿼리도 final static으로 선언하면 GC대상에 포함되지 않기 때문에 성능에 좋다. 즉 템플릿 성격의 객체를 static..
Switch-Case 문 Switch-Case문은 작은 숫자부터 큰 숫자 순서대로 비교하는 것이 제일 빠르다. 조건문 조건문자체는 속도에 미치는 영향이 미미하다. 가독성에 더 신경쓰자. do-while문 public void test(List list){ int i=0; do{ if(list.get(i) == 10) break; }while(true); } 만약 list의 0번째가 10이라면 정상적인 동작을 하겠지만, 아닐 경우 무한루프를 돌며 CPU의 코어 한개를 잡아먹으므로 프로그램을 재시작해야할 수 있다. 조심하자 List를 대상으로 반복 for(int i=0; i
SetSet의 종류에는 HashSet, LinkedHashSet, TreeSet이 있다. Set은 보통 여러 데이터를 넣어두고 해당 데이터가 존재하는지 확인할 때 사용한다.속도는 HashSet이나 LinkedHashSet이 빠르고, TreeSet은 나머지에 비해 현저히 느리다. 그렇다면 왜 TreeSet을 사용할까?TreeSet은 데이터를 저장하는 동시에 정렬한다.그렇기 때문에 데이터를 순서에 따라 탐색하는 작업이 필요할 때에는 TreeSet을 사용하는 것이좋다. 하지만 그럴 필요가 없을 때에는 속도가 빠른 HashSet이나 LinkedHashSet을 사용한다. List 자료형 / 속도순위 삽입 추출 첫번째 값 삭제 마지막 값 삭제 ArrayList 1위 1위 1위 1위 LinkedList 3위 3위 2..
- Total
- Today
- Yesterday
- Java8
- 날짜
- 성능개선
- Java
- rambda
- gitlab
- Swift 2.0
- Jackson
- 자바
- RAMDA
- opensource
- Stream
- javascript
- Clojure
- 코어
- 자료구조
- Docker
- 메모리
- 성능
- json
- 퍼포먼스
- 리액트
- 시간
- 프로세서
- 알람
- 자바 성능
- 클로저
- 람다
- react
- 컴퓨터 시간
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |