본문 바로가기

Old Posts226

[Linux] 디스크(Disk), 파티션(Partition)과 볼륨(Volume)의 차이 서버의 저장장치와 저장공간에 대한 모니터링을 진행하면 '디스크(Disk)', '파티션(Partition)', '볼륨(Volume)'이라는 단어를 자주 접하게 된다. 이 중 파티션(Partition)과 볼륨(Volume)이라는 단어는 많이 혼용되기도 하는데, 정확하게 이들이 어떻게 다른지 찾아서 정리해봤다. 디스크(Disk) 디스크는 일반적으로 서버에 장착되어 있는 물리적인 저장장치를 의미한다. 원래 디스크는 자기 물질이 발라져있어 데이터를 저장할 수 있는 디스크 플래터(Platter)와 데이터를 읽고 쓸 수 있는 디스크 헤더, 그리고 디스크 헤더를 특정 위치로 위치시키는데 사용되는 디스크 암(Arm)으로 구성되어 있는 하드디스크(HDD)를 의미한다. 하지만 최근에는 SSD나 플래시 메모리, RAM 디스크.. 2021. 8. 5.
[Java(자바)] ThreadLocal 사용법 설명과 예제 자바를 이용해 멀티 스레드 프로그래밍을 하면 성능향상을 얻을 수 있다. 하나의 스레드에서 해야할 작업들을 여러스레드로 나누어 동시에 처리하면 훨씬 빠른 시간안에 작업을 마무리할 수 있다. 하지만 멀티 스레드 프로그래밍에서 가장 고민해야할 부분은 공유 리소스에 대한 동시성 제어다. 여러 스레드가 공통으로 접근하는 변수 값을 저장하고 읽는 과정을 동기화해야 문제가 생기지 않는다. 자바는 synchronized 키워드를 이용해서 특정 메소드 혹은 코드 블럭을 동기화 시키는 방법을 제공한다. synchronized 키워드와 더불어 자바에서 제공하는 도구로 ThreadLocal이 있다. ThreadLocal은 각 스레드가 자신만 접근할 수 있는 변수로 여러 스레드가 동시에 접근할 수 있지만 각자 자기만의 공간을 .. 2021. 7. 30.
[Java] SAXParser Exception - "[Fatal Error] :1:1: Premature end of file" 예외 해결방법 자바 애플리케이션에서 SAX 파서를 이용해 XML 문서를 파싱하다가 다양한 예외를 만나게된다. 이번 포스트에서 설명할 예외는 "[Fatal Error] :1:1: Premature end of file." 혹은 "[Fatal Error] :1:1: 예기치 않은 파일의 끝입니다."라는 Exception이다. 말 그대로 SAX 파서의 입력 스트림이 예상하지 갑작스레 끝났을 경우에 발생한다. 가장 흔한 예외 케이스는 SAX 파서에 빈 문자열이 입력되면 발생한다. 다음 예제 코드르 보자. import java.io.StringReader; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import.. 2021. 7. 29.
[Java] XML 서브 트리를 루트로하는 새로운 XML Document 생성 (org.w3c.dom.Node 클래스를 Document로 변환) XML 문서는 트리 형태로 해석할 수 있다. 그러다보니 루트에서 따라내려가다가 XML 문서의 특정 서브트리 부분을 루트로하는 새로운 XML 문서를 만들고 싶은 경우가 있다. 예를 들어 다음과 같은 XML Document가 있다고 하자. value 1 value 2 value 3 XPath 등을 이용해서 에 해당하는 Node 객체를 얻어왔을 때 노드의 서브 트리를 Root로 하는 새로운 Document를 얻어오고 싶을 경우가 있다. value 3 org.w3c.dom.Document 인터페이스에는 importNode() 라는 메소드가 있으며, 이 메소드를 이용해서 새로운 Document를 만들 수 있다. org.w3c.dom.Node 클래스를 Root로 하는 새로운 org.w3c.dom.Document를 .. 2021. 7. 28.
[Java] GSON 라이브러리 사용법 및 예제 - 자바 객체와 JSON 다루기 자바를 이용해 데이터를 주고 받을 때 직렬화(Serialize) 포맷으로 JSON이나 XML 같은 텍스트 포맷을 사용하는 경우가 많다. 특히 REST API를 통해 데이터를 제공하는 경우 json이나 xml 포맷을 표준으로 삼는 경우가 많다. 텍스트를 사용하는 만큼 데이터를 처리하는데 상당히 높은 수준의 유연성을 제공하기 때문이다. 다만 텍스트로 표현되어있는 데이터에서 원하는 데이터를 뽑아오기 위해서는 문서를 파싱해야한다. 이번 포스트에서는 JSON 문서를 파싱하기 위해 GSON 이라는 라이브러리를 사용하도록 하겠다. GSON GSON은 구글에서 만든 자바 오브젝트의 직렬화/역직렬화 라이브러리다. GSON은 내부적으로 리플렉션(Reflection)을 사용하고 있어 사용자가 귀찮게 이런저런 옵션을 넣어주지.. 2021. 7. 27.
[Java] Unmodifiable Collection vs Immutable 차이점 카프카 코드리뷰를 하다가 'Unmodifiable Collection'이라는 것을 보게 되었다. 카프카 소스코드는 다음과 같았다. private List drainRecords(int n) { if (isDrained() || position >= records.size()) { drain(); return Collections.emptyList(); } // using a sublist avoids a potentially expensive list copy (depending on the size of the records // and the maximum we can return from poll). The cost is that we cannot mutate the returned sublist... 2021. 7. 26.
[Java] 'for each' 구문에서 사용할 클래스 구현 자바에서 컬렉션에 들어있는 데이터를 순회하면서 처리할 때 반복문을 많이 사용한다. 가장 기본적으로 배열에 들어있는 데이터들을 하나씩 꺼내 출력하는 코드는 다음과 같다. public static void main(String[] args) { int array[] = {1, 2, 3, 4, 5}; for (int i = 0; i < array.length; i++) { System.out.println(array[i]); } } // 출력 // 1 // 2 // 3 // 4 // 5 초기부터 자바를 사용해왔거나 C언어 같은 언어롤 사용하던 프로그래머라면 이런 형태의 반복문이 자연스럽다. 하지만 자바는 컬렉션 데이터나 배열의 접근을 좀더 편하게 제공하기 위해서 'for each' 구문을 JDK 5.0 버전부.. 2021. 7. 25.
[Java] 컬렉션들의 시간복잡도 (Collection Big-O) 자바를 이용해서 알고리즘 문제를 풀거나 큰 사이즈의 데이터를 다룰 때, 컬렉션들의 정확한 시간복잡도(Big-O)를 알고 사용하는 것이 중요하다. 자칫 불필요하게 느린 컬렉션이나 메소드를 사용할 경우 예상치 못한 성능저하를 만날 수 있기 때문이다. List add() remove() get() contains() ArrayList O(1) O(n) O(1) O(n) LinkedList O(1) O(1) O(n) O(n) CopyOnWriteArrayList O(n) O(n) O(1) O(n) 참고로 LinkedList의 삭제 연산인 remove() 메소드는 삭제할 노드에 대한 참조를 가지고 있다는 가정하에 O(1)임을 유의해야한다. 만약 처음부터 지울 데이터를 찾아야한다면 탐색 비용인 O(n)이 소요된다... 2021. 7. 24.
[Java] json-simple (JSONObject, JSONArray, JSONParser) 사용법 및 예제 자바를 이용해 JSON 포맷으로 표현된 데이터를 손쉽게 다루기 위해서 'json-simple'이라는 라이브러리를 사용할 수 있다. 문자열 형태로 데이터를 표현하는 JSON 문서를 파싱하고 각 엘리먼터들을 손쉽게 접근하고 변경할 수 있다. 요즘 REST API 들이 데이터를 JSON 형태로 제공하는 경우가 많은데, 이 경우 JSON 형태의 문자열 데이터를 파싱해야할 필요가 생긴다. json-simple 라이브러리 의존성 메이븐(Maven) 프로젝트를 사용하는 유저라면 간단하게 다음 의존성(Dependency)을 추가하면 json-simple 라이브러리를 사용할 수 있다. 일반 프로젝트라면 json-simple 라이브러리가 포함되어 있는 jar 파일을 프로젝트에 포함해야한다. com.googlecode.js.. 2021. 7. 23.