자바는 패키지(package)를 통해 만들어 놓은 클래스와 인터페이스를 사용합니다. 패키지는 import 문을 통해 불러옵니다. 패키지에 모듈이 더해지면 라이브러리가 됩니다. 라이브러리를 통해 개발된 기능 및 동작을 다른 시스템에 연동 개발 할 수 있습니다. 자바 패키지란? 자바에서 패키지는 클래스와 인터페이스를 묶어 놓은 집합을 의미합니다. 하나의 폴더 안에 다양한 하위 폴더와 파일이 있는 구조라고 이해할 수 있습니다. 패키지는 또 다른 패키지를 포함합니다. 이때 하위 디렉터리로 내려가는 구분은 점(.)으로 합니다. 자바 내장 패키지 가장 대표적인 패키지는 자바 개발 환경(Java Development Environment)에 포함된 내장 패키지입니다. 예를 들어, 자바에서 문자열을 담을 수 있는 객체..
자바 스레드 덤프 자바 스레드 덤프(Thread Dump)란 JVM에서 활성화된 모든 스레드의 목록을 말합니다. 스레드란 프로세스 내에서 작업을 수행하는 주체입니다. 하나의 프로세스에 여러 개의 스레드가 사용되면 멀티 스레드 프로세스라고 부릅니다. 스레드 덤프 분석하는 이유 스레드가 많이 사용되면 CPU 및 메모리 사용량을 증가시킵니다. 스레드 덤프를 확인하면 구체적으로 어떤 모듈이 CPU를 많이 사용하는지 확인할 수 있습니다. 애플리케이션의 CPU 사용량이 급증하거나 OutOfMemoryError 등이 발생할 때 스레드 덤프를 분석하는 방법으로 원인을 찾을 수 있습니다. 스레드 덤프 수집 방법 자바 스레드 덤프를 수집하는 방법은 여러 가지입니다. 이 글에서는 jstack.exe를 이용한 간단한 방법을 ..
자바로 개발한 소프트웨어 설치셋에서 JNI라는 폴더를 본적이 있으신가요? 자바 개발의 한계를 극복시켜주는 JNI에 대해 설명드리겠습니다. Java의 장점과 한계 자바 코드의 장점은 플랫폼으로부터 독립적이라는 것입니다. 쉽게 말해, 자바로 코딩한 소프트웨어는 리눅스에서도 동작하고, 윈도우에서도 동작합니다. 왜냐하면 두 OS 모두 JVM(Java Virtual Machine)을 사용할 수 있기 때문입니다. JVM은 플랫폼에 상관없이 자바 코드를 읽고 실행합니다. 구체적으로 말하면 자바 언어로 코딩해 만든 .java 파일을 컴파일한 .class 파일을 읽습니다. 그러나 자바로 개발한 소프트웨어일지라도 네이티브 코드(native code) 사용이 필요한 순간이 있습니다. 네이티브 코드란 C, C++처럼 (JVM..
아파치 톰캣 아카이브에는 최신 버전 이전의 톰캣 버전이 보관돼 있습니다. 이곳에서 원하는 톰캣 버전을 다운로드 받아 사용할 수 있습니다. Tomcat 톰캣은 자바 서블릿, 자바 서버 페이지, 자바 EL, 웹소켓 등이 포함된 WAS(Web Application Server)입니다. 자바가 실행될 수 있는 환경을 만들어줍니다. Tomcat 원하는 버전 다운받는 방법 1. 톰캣 아카이브 페이지로 접속합니다. 아파치 톰캣 아카이브 2. 원하는 톰캣의 버전을 선택합니다. 3. 톰캣의 세부적인 패치 버전을 선택합니다. 4.bin 폴더를 클릭합니다. 5. OS에 따라 리눅스용은 tar.gz, 윈도우용은 zip 파일을 선택해 다운로드합니다. 맨 아래 빨간색 글씨로 다운받는 톰캣 버전을 사용하기 위해 자바의 몇 버전 이..
jar는 Java ARchive의 약자입니다. 자바 저장소(또는 보관소)라는 뜻처럼 자바로 개발한 기능 모듈을 말합니다. jar는 zip과 마찬가지로 압축 파일입니다. jar 파일 안에는 자바 애플리케이션을 실행하기 위한 클래스 파일, 이미지 파일, 소리 파일 등 다양한 종류의 파일이 포함됩니다. 애초에 jar 파일이 등장한 배경도 한 번의 HTTP 트랜잭션으로 브라우저에서 다운로드할 수 있도록 하기 위함이었습니다. 그러기 위해선 모듈 작동에 필요한 모든 파일을 패키지로 제공하는 형태가 이상적이었죠. jar 파일은 크로스 플랫폼을 지원합니다. 예를 들어, 윈도우에서 자바로 개발한 모듈을 jar 파일로 패키징하면 이 파일은 맥(Mac)이나 리눅스(Linux)에서도 정상적으로 동작합니다. 단 운영체제(OS)..
직렬화 자바에서 직렬화란 객체 데이터를 바이트(Byte) 형태로 변환하는 것이다. '직렬'이라는 말대로, 한 줄로 쭉 늘어놓은 바이트 데이터를 생각하면 된다. 객체에 마구 쌓여있는 데이터들이 바이트 단위로 정렬되는 형태라고 볼 수 있다. 직렬화는 java.io 패키지의 Serializable 인터페이스를 implements하면 가능하다. 단 직렬화 대상은 필드(멤버변수)들이다. 생성자와 메서드는 대상에 포함되지 않는다. 사용하는 이유 객체를 왜 바이트 단위로 변환해야할까. 데이터를 외부 서버로 전송하기 위해서다. 자체 메모리 위에서만 데이터를 운용한다면 굳이 직렬화하지 않아도 객체를 주고받을 수 있다. 그러나 객체를 DB에 저장하거나 파일로 저장한 객체를 전송하는 등의 상황에선 스트림을 통해 데이터를 보..
객체(Object)란 자신의 속성을 가지고 있고 다른 것과 식별이 가능한 존재를 말한다. 객체는 속성과 동작으로 구성된다. 다소 추상적이지만 예시를 보면 이해하기 쉽다. 자동차는 객체다. 색상, 모델명 같은 속성이 있고 달리고 멈추는 동작이 있다. 만약 자바 클래스로 표현한다면 public class Car { String color; String model; void move(){} void stop(){} } 과 같이 표현할 수 있을 것이다. 이때 속성을 필드(field), 동작을 메서드(method)라고 부른다.
타입(Type · 형) 자바에서 모든 변수에는 타입(형)이 있다. 어떤 타입을 지정하느냐에 따라 변수에 저장할 수 있는 값의 종류와 범위가 결정된다. 크게 기본 타입과 참조 타입으로 구분된다. 기본 타입에는 정수, 실수, 문자, 논리 리터럴(참, 거짓) 등을 저장한다. 참조 타입에는 주소값으로 배열, 클래스, 인터페이스 등을 저장한다. 기본타입(primitive type) - 기본형 래퍼 클래스(wrapper class) - 참조형 byte Byte char Character int Integer float Float double Double boolean Boolean long Long short Shrot 자바는 기본 타입의 값을 갖는 객체를 생성할 수 있다. 이런 객체를 포장(wrapper) 객체,..
web.xml 문서에 코드를 작성할 때 통상 정해진 순서에 맞춰 태그를 넣어준다. 그런데 막상 태그의 순서에 맞지 않게 코드를 작성해도 문제없이 작동하는 경우가 많다. 왜 순서를 맞춰주는 걸까? 이 부분이 궁금해 검색을 좀 해봤지만 쉽사리 명쾌한 해답을 찾진 못했다. 일단 현업자로부터 들은 답은 스프링 프레임워크에서 가끔씩 정의된 순서와 다르게 코딩한 경우 작동에 문제가 생기는 경우가 있다는 것이다. 다만 그 뉘앙스가 그렇기 때문에 '꼭 지켜야한다'보다는 '가급적 지키는 것이 좋다'는 느낌이었다. 나도 의문을 갖긴 했지만 굳이 약속된 순서를 지키지 않을 이유는 없기 때문에 되도록 태그 순서를 지켜서 사용하고 있다. content model에 xml에서 사용할 수 있는 정의된 태그가 나와 있다. 이 태그만..
메이븐 프로젝트를 쓰는 이유는 라이브러리 관리를 훨씬 편하게 만들어 주기 때문이다. 자바 프로젝트를 진행하다 보면 jar 파일(자바 아카이브)을 활용하게 된다. jar 파일은 자바 클래스와 관련된 리소스, 데이터, 클래스 등을 모은 패키지다. 압축을 풀지 않고 사용한다. 즉, 압축된 파일을 프로젝트에 넣어주는 것만으로도 jar 파일이 구현하는 기능을 편리하게 이용할 수 있다. 메이븐 없이도 jar 파일을 사용할 수 있다. 그러나 사용하는 jar 파일이 많아질수록 관리가 복잡해지는 문제가 생긴다. 이는 jar 파일이 가지고 있는 의존성 때문이다. 예를 들어 dbcp2라는 jar 파일을 사용하려면 pool2와 logging과 함께 사용해야 한다. 이처럼 의존성을 가진 jar 파일을 많이 사용하다보면 수동으로..