[Stream과 I/O] 1. Byte와 Stream,ASCII 코드
·
Backend
현재 서버에서 대용량 파일을 업로드하고 이후 로직을 최적화해야하는 상황이다.어떻게 하면 File IO/비동기 및 병렬 처리를 효율적으로 할 수 있을지에 대해 고민하며 공부한 내용을 적어보았다 개요File I/O에 대해서 알아보기 전에, 우선 Java의 입출력 I/O에 대해서 알아보자프로그램에서는 어떻게 파일, 키 입력 등의 데이터를 입력하고 처리하는걸까 ? 컴퓨터의 데이터 처리 단위1. Bit & Byte사람이 언어를 통해 의사소통을 주고받듯이, 컴퓨터도 연산을 이해하기 위한 언어가 존재한다.그 최소 단위가 Bit와 Byte이다.1.1. Bit란 ?비트(bit)는 Binary Digit의 줄임말로 컴퓨터에서 처리하는 정보의 최소 표현 단위이다.비트는 2진수로서, on/off를 의미하는 0과 1의 두 가지..
Spring에서 외부 API 호출하기(WebClient 사용)
·
Backend/Java&Spring&Servlet
이번에 클라이언트와 내부 서버들의 통신을 위한 중간 서버를 만들기 위해 Spring기반의 서버 내부에서 타 서버로의 API 호출이 필요했다. 가장 최근에 도입된 WebClient 활용 그거 말고는 아래 방식들이 있음 1. HttpURLConnection 스프링이나 외부 라이브러리가 아닌 Java 표준에서 제공하는 HTTP Connection 클래스이다. URLConnection을 상속받고있음 옛날옛적에 사용하던거 2. RestTemplate Spring 3.0부터 도입된 클래스로, 동기적인 HTTP 통신을 위해 쓰인다. 3. WebClient 비동기/논블로킹 방식을 지원 리액티브 프로그래밍이 가능하며 데이터 스트림을 효과적으로 처리할 수 있음 등등... 프로젝트 구조는 다음과 같이 잡아보았다 common..
[Java] Heap Memory 누수 분석기4 : dump파일 분석(MAT)
·
Backend/Java&Spring&Servlet
이전 글에서 이어집니다 : [Java] Heap Memory 누수 분석기3 : 누수 원인을 분석해보자 - jmap, jhat 그래서 메모리 누수 원인은 뭐였을까? MAT를 통해 뜬 덤프 파일을 분석해보았다. .hprof 파일을 열면 다음과 같이 확인해볼 수 있다. 딱 봐도 저 파란 부분이 메모리를 왕 잡아먹고 있는 것으로 보인다. Leak Suspects라는 탭을 클릭하면 메모리 누수 원인을 MAT가 예측해준다. 역시나 Finalizer가 문제였던 것으로 보인다. 그래서 Finalizer는 뭐냐 ? 메모리 해제/GC를 담당하는 객체이다. (참고링크 : https://ivvve.github.io/2019/06/05/java/ETC/fileiostream-finalizers/) finalize() 메서드가 ..
[Java] Heap Memory 누수 분석기3 : 누수 원인을 분석해보자 - jmap, jhat
·
Backend/Java&Spring&Servlet
이전 포스팅에서 이어집니다. : [Java] Heap Memory 누수 분석기2 : 모니터링 환경 구축하기 - VisualVM 그래서 VisualVM을 이용하면 로컬 환경에서는 테스트해볼 수 있었는데 사실 그것만으로는 상용 환경에서의 메모리 누수 원인을 확정하기에는 근거가 너무 부족했다. 그래서 jmap 명령어를 이용해서 Heap Dump파일을 생성해보기로 하였다. Heap Dump Heap Dump 뜨는 방법으로 jmap 과 jcmd 가 있음 jmap : GC를 동반하지 않고, 죽은 객체까지 포함하여 인스턴스의 점유율을 보여준다. jcmd 와 같이 full GC를 발생시키고싶으면 -live 옵션을 붙이면 된다 jcmd : Full GC를 발생시킨 후 살아있는 인스턴스의 점유율만 보여줌 처음에는 이 명령..
[Java] Heap Memory 누수 분석기2 : 모니터링 환경 구축하기 - VisualVM
·
Backend/Java&Spring&Servlet
이전 글에서 이어집니다 : [Java] Heap Memory 누수 분석기1 : JVM이란 ? 그래서 JVM이 뭔지 대략적으로 알았으니 내 프로그램에서 이 JVM이라는 녀석이 어떻게 돌아가고 있는지 확인해보려고 한다. 일단 여러가지 모니터링 툴이 있다고 해서 써봤는데, 분석이 쉽지 않았다. (첨에는 InteliJ에 내장되어있는 Profiler를 통해서 보려고 했으나 서비스 프로세스에 부하 좀만 주면 프로세스 다운 전에 InteliJ 자체의 메모리가 터져서 죽어버렸다 ;;;) 가장 간편한 방법은 바로 힙 덤프를 떠서 확인해보는거였지만, 고객들에게 제공되고있는 서비스였기때문에 막 덤프 떠버리기는 좀 부담이 있었다. 특히 구글링 중 봤던 아래 문구때문에 힙덤프는 마지막 후순위로 미루고싶었음 ❗주의!! 힙 히스토..
[Java] Heap Memory 누수 분석기1 : JVM이란 ?
·
Backend/Java&Spring&Servlet
구축해둔 모니터링 시스템 통해 간헐적으로 알림이 오기 시작했다. 서버 구동한지 한달정도 지나니 초기에 40%정도였던 힙메모리 사용률이 지속적으로 70%대를 돌파하고있었다. 왜 그런고 하니,,, 대충 이런 모양새였다 (마우스패드로 그려서 이상함) minorGC가 일어나면서 간헐적으로 메모리 영역이 줄어들지만 메모리가 제대로 해제되지 못한(=누수가 일어나는 부분의) 객체들이 차지하는 메모리가 지속적으로 쌓이면서 평균적인 메모리 사용률이 올라가게 된 것이다. 하지만 기존에 구축되어있던 모니터링 도구로는 어떤 객체가 메모리를 잡아먹는지나,, 상세한 시간대별 힙메모리 소모율 등등은 볼 수 없었다. 그래서 모니터링 환경을 추가적으로 구축하려고 했다. 대충 알아보니 다음과 같은 방법들이 있더라 VisualVM He..
웹 애플리케이션(Web Application)
·
Backend/Java&Spring&Servlet
1. 웹 애플리케이션이란? - 기존의 정적인 웹 애플리케이션 기능들은 그대로 사용하면서 추가로 서블릿, JSP, 자바 클래스 등을 사용하여 동적인 서비스를 제공하는 프로그램이다. 2. 웹 애플리케이션의 기본 구조 - 톰캣과 같은 웹 컨테이너에서 실행하는 웹 애플리케이션은 일정한 디렉터리 구조를 갖추고 있다. 그 외 디렉터리들의 기능 └ bin: 앱에서 사용되는 각종 실행파일들 저장 └ conf: 프레임워크에서 사용되는 각종 설치파일 저장 3. 컨테이너에서 웹 애플리케이션 실행하기 - 웹 애플리케이션은 자바 App 등과는 반대로 단독으로 실행될 수 없다. - 톰캣과 같은 웹 컨테이너에서 실행되는 구조 → 즉, 실행 전 톰캣에 등록부터 해야 한다. * 톰캣 등록 방법 1. %CATALINA_HOME%webA..
웹 프로그래밍과 JSP
·
Backend/Java&Spring&Servlet
웹 프로그래밍은 동적 웹 프로그래밍(JSP)과 정적 웹 프로그래밍(초기 웹 프로그래밍)으로 구분할 수 있다. 1. 정적 웹 프로그래밍 ( Static Web Programming) - 웹 서버(Apache)에 미리 보여줄 HTML, CSS, img, JavaScript 등의 파일을 정해놓고, 사용자가 요청할 경우 전달하는 방식 - 사용자는 페이지가 변경되지 않는 한 고정된 웹 페이지를 보게된다. - UI 구성이나 이벤트 처리 등에 사용 - 구성요소: 웹 서버, 클라이언트, HTTP, HTML, JavaScript, CSS * 문제점: 환율, 주가와 같은 실시간 정보를 처리하기 위해서는 관리자가 HTML 코드를 수시로 업데이트해줘야 한다. → 이와 같은 이유로 요새는 많이 사용하지는 않지만, 디자인이나 이..
프로그램의 발전 과정, 웹 기반 프로그램
·
Backend/Java&Spring&Servlet
1. 클라이언트 PC 프로그램 - 소스코드 등으로 프로그램을 구현한 뒤, 일괄적으로 배포하는 방식의 프로그램 - 업데이트시마다 일일이 다시 설치해야되며, 정보가 쉽게 노출될 수 있어 보안에 취약하다는 단점이 있다. - 환세취호전같은 고전게임이나 과제로 만들던 자바 프로젝트 등이 클라이언트 PC프로그램이라고 이해하면 된다. 2. 클라이언트-서버 기반 프로그램 - 기능상의 로직이 변경되는 경우에는 서버에서만 처리하면 된다. - 보안성 측면에서도 클라이언트 PC 프로그램보다 우수 - 하지만 UI관련 수정사항이 있을경우에는 클라이언트 프로그램도 수정해야한다. 3. 웹 기반 프로그램 - 웹 브라우저를 통해 요청하는 페이지를 서버에서 표시해주는 방식 - 화면과 로직을 모두 서버에서 수행하므로 클라이언트가 특별히 수..