본문 바로가기

Java65

Java) 데몬 쓰레드와 사용자 쓰레드 데몬 쓰레드와 사용자 쓰레드 !!! JVM은 사용자 쓰레드의 작업이 끝나면 기능을 전부 수행하지 않은 데몬 쓰레드도 자동으로 종료시켜 버림.!!! 데몬 쓰레드: 보이지 않는 곳에서 실행되는 낮은 우선순위를 가진 쓰레드 (대표적인 데몬 쓰레드: 가비지 컬렉터) 쓰레드를 만들 때 thread.setDaemon(true)를 통해 명시적으로 할당해 줘야 함 사용자 쓰레드: 보이는 곳에서 실행되는 높은 우선순위를 가진 쓰레드 (대표적인 사용자 쓰레드: 메인 쓰레드) 프로그램 기능을 담당하며 대표적인 사용자 쓰레드로는 메인 쓰레드가 있다. 쓰레드 우선순위 쓰레드 작업의 중요도에 따라서 쓰레드의 우선순위를 부여할 수 있다. JVM에 의해 지정되며, 최대(10), 최소(1), 보통(5)의 우선 순위를 갖는다. 기본 값.. 2023. 9. 18.
백준) 단어 공부(1157번) 1157번: 단어 공부 알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다. www.acmicpc.net import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); String word = bf.readLine().toUp.. 2023. 9. 17.
백준) 더하기 사이클(1110번) 1110번: 더하기 사이클 0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, www.acmicpc.net import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); int f.. 2023. 9. 16.
Java) 프로세스와 쓰레드 프로세스: 운영체제로부터 자원을 할당받는 작업의 단위 쓰레드: 프로세스가 할당받은 자원을 이용하는 실행의 단위 프로세스의 구조 OS가 프로그램 실행을 위한 프로세스를 할당해줄때 프로세스안에 프로그램 Code와 Data 메모리영역을 함께 할당해준다. Code는 Java main 메소드와 같은 코드를 말한다. Data는 프로그램이 실행중 저장할 수 있는 저장공간을 의미한다. Memory는 지역변수, 매개변수 리턴변수를 저장하는 Stack 영역과 프로그램이 동적으로 필요한 변수를 저장하는 Heap 영역으로 나뉜다 쓰레드 프로세스가 작업중인 프로그램에서 실행요청이 들어오면 쓰레드를 만들어 명령을 처리하도록 한다. 프로세스 안에는 여러 쓰레드가 있고, 쓰레드들은 실행을 위한 프로세스 내 주소공간이나 메모리공간(H.. 2023. 9. 14.
Spring) 평균 응답 시간 개선 현재 입찰 요청의 평균 응답 시간은 1300/ms이다. 일반적으로 클라이언트가 이용하기엔 매우 불편한 수치이다. 문제 원인 파악 현재 비동기로 이벤트를 발송하는 구조에서 많은 사용자가 연결 되었을 때, 내부적으로 이벤트를 전송하는 로직에 자원을 많이 사용하나? 라는 가설을 세우고 테스트를 진행해보았다. 연결을 하지 않고, 입찰 요청만 보냈을 때 응답 시간이 현저히 낮은 것을 확인했다. 입찰 요청의 문제가 아닌 연결 하고 이벤트를 발송할 때 생기는 문제라고 생각이 되었다. 이벤트 발송하는 로직에서 Emitter들이 유효한지 확인하는 반복문을 제거하여 테스트를 더 진행해 보았다. 응답시간이 줄어듦을 확인했다. 문제가 일어난 이유 SSE는 특성상 클라이언트가 접속을 끊었는지 확인하기 어렵다. 그러하여 이벤트를.. 2023. 8. 31.
Spring) Transaction 처리 속도 향상 scale-up을 하고도 Time out 에러가 발생했다. 서버의 자원은 아직 견딜 만 한데도 Time out이 발생한다. 이는 Transaction의 처리 속도가 느리니 Lock이 걸려있는 시간도 길어진다. 그러므로 Lock을 얻기위해 Connection 들은 기다린다. 그렇게 되며 병목현상이 발생하고, HandOffQueue에서 대기하는 Thread들의 시간이 30초를 넘으며 time out이 발생하는 것 같다. 문제 원인 파악 각각의 시간이 얼마나 걸리는지 로그를 찍어 확인해 보았다. 그 결과 발생하는 이벤트를 전송하는(Bid Update Send) 과정에서 처리하는 시간의 90% 이상을 차지한다. 문제가 발생한 원인 업데이트 된 입찰가를 연결되어있는 클라이언트들에게 보내는 과정에서 많은 시간이 소.. 2023. 8. 28.
Java) 병목현상 해결 과정 SSE 연결 후에 입찰 요청 성능테스트를 진행하는 과정에서 생긴 문제이다. HikariCP Time out이 발생했다. 첫 번째 가정: 다른 API에서 물린 Connection이 아직 남아있는 건가? 나는 입찰과 조회를 동시에 트래픽을 발생시키기 위해 입찰과 조회 동시에 요청, 입찰만 요청, 조회만 요청 등등 경우의 수를 테스트 했었다. 그렇다면 입찰 쪽이 아니라 조회 쪽에서 Connection을 차지하고 있을 수도 있겠다는 생각에 RDS를 재부팅하고 입찰만 테스트 해보았다. 처음의 성능 테스트는 잘 이루어 졌지만, 두 번째 테스트 부터 같은 에러가 발생했다.. 서로의 상관관계는 없어보인다. 두 번째 가정: HikariCP에서 생긴 Deadlock? 하나의 Thread가 하나의 Connection을 요청.. 2023. 8. 23.
JMeter 변수 설정 JMeter에서 테스트를 하게 된다면 나의 프로젝트에 맞게 테스트 할 데이터를 설정해야 한다. Request Body 설정 더보기 로그인 API 에서는 Body에 ID와 password 값을 담아서 요청해야 한다. 1. HTTP Request Sampler에서 Body Data 진입 후 값을 입력한다. 2. HTTP Header Manager를 설정한다. JMeter에서 보내는 요청을 JSON으로 서버에서 인식할 수 있게 설정하기 위해서다. HTTP Request Sampler 우클릭 -> add -> Config Element -> HTTP Header Manager 생성 토큰값 추출 더보기 login이 성공적으로 됐으면 토큰값이 Header에 담겨 올 것이다. 인가할 때 필요한 토큰값이 필요하니 추출.. 2023. 8. 15.
JMeter 성능 테스트 현재 진행중인 프로젝트는 대용량 트래픽과 데이터 처리가 목적이니 성능테스트가 필요하다. 테스트 도구 선정 기준 더보기 → GUI가 제공 되는가? → HTTP, WebSocket 프로토콜을 사용하기 때문에 2가지를 제공하는가? → 간단하게 설정을 할 수 있는가? → 참고할 수 있는 레퍼런스가 많은가? → 비용이 들지 않는가? → 어플리케이션과 데이터베이스 모두 테스트할 수 있는가? → 우리에게 친숙한 언어로 작성이 가능한가? JAVA or Groovy 위의 기준을 토대로 JMeter를 선정하게 되었다. 성능 테스트 더보기 현재 DB에 저장되어 있는 user의 수는 100,000 명 이다. 이를 기준으로 평상시의 접속자를 2~5%로 잡았고, 어느정도 까지 버틸 수 있는지 테스트 해보았다. 지표: https:.. 2023. 8. 15.