본문 바로가기

포스트464

[Java] Freemarker - 데이터 모델(Data Model) 만들기 프리마커 템플릿 엔진은 템플릿과 데이터 모델을 이용해 문서를 생성한다. 데이터 모델은 HashMap 같은 객체를 이용할 수도 있지만 직접 프리마커 엔진이 해석할 수 있는 클래스를 정의할 수도 있다. 프리마커 엔진이 데이터 모델로 해석할 수 있도록 ObjectWrapper 클래스와 Adapter 클래스를 구현해줘야한다. 프리마커 엔진은 ObjectWrapper 클래스와 Adapter 클래스를 통해서 자바 객체를 트리형태로 해석한다. ObjectWrapper 우선 데이터 모델로 사용할 클래스는 ObjectWrapper 인터페이스를 구현해야한다. ObjectWrapper 인터페이스는 다음 메소드를 가지고 있다. TemplateModel wrap(Object obj) throws TemplateModelExce.. 2021. 7. 17.
[Java] 프리마커 스페셜 템플릿 변수들(Freemarker Special Variables) 프리마커 템플릿 언어(FTL, Freemarker Template Language)에는 몇가지 특별한 변수들이 있다. 이 특별 변수들을 사용하기 위해서 템플릿을 작성할 때 '.variable_name' 형태로 사용해야한다. 즉, auto_esc라는 특별 변수를 템플릿에서 사용하려면 .auto_esc로 사용해야한다. 프리마커 템플릿 언어의 특별 변수들은 기본적으로 스네이크 표현법을 지원하며 2.3.23 버전부터 카멜 표기법도 제공된다. 프리마커 특별 변수들 auto_esc auto-escaping 설정 여부를 의미하는 불리언 변수 caller_template_name 현재 매크로 혹은 함수가 호출된 템플릿의 이름(경로) current_template_name 현재 템플릿의 이름(경로) data_model .. 2021. 7. 16.
[Java] 프리마커 템플릿 언어(FTL, Freemarker Template Language) 문법 자바 템플릿 엔진(Java Template Engine)인 프리마커(Freemarker)는 FTL(Freemarker Template Language)라는 언어를 통해 템플릿을 작성할 수 있도록 한다. FTL에는 간단한 데이터 치환뿐만 아니라 조건문이나 반복문 같은 다양한 문법과 기능이 구현되어 있다. 따라서 FTL 문법을 잘 알고 있으면 효율적으로 템플릿을 작성할 수 있다. FTL의 모든 문법이나 정확한 기능에 대해서는 Freemarker 매뉴얼을 참고하도록 하자. 이 포스트에서는 자주 사용하는 FTL 문법과 기능을 소개하고 간단한 사용법을 예제를 통해 설명하겠다. assign 템플릿 작성시 변수를 사용하고 싶을 때, assign 디렉티브를 사용할 수 있다. 예를 들어 this code block as.. 2021. 7. 15.
[Java] 프리마커(Freemarker) - 자바 템플릿 엔진(Java Template Engine) 프리마커는 아파치 오픈소스로 공개되어 있는 자바 템플릿 엔진(Java Template Engine)이다. 템플릿 엔진(Template Engine)이란? 템플릿 엔진(Template Engine)이란 데이터 모델에서 정보를 얻어 템플릿 양식에 맞게 문서를 만들어주는 소프트웨어를 말한다. 템플릿 엔진의 사용자는 템플릿 정의 언어를 이용해서 문서화할 템플릿을 생성하고 템플릿 엔진에 입력한 다음 데이터 모델을 차례로 템플릿 엔진에 입력하여 문서를 만들어낸다. 템플릿 엔진 사용의 대표적인 예는 '웹 템플릿 엔진(Web template engine)'이다. 웹 페이지의 전체적인 아웃라인을 템플릿으로 만들어놓고, 페이지에 보여줄 상세한 데이터를 이용해 구체적인 HTML 문서를 만들어주는 형태로 템플릿 엔진이 사용된.. 2021. 7. 14.
[Java] 자바 클래스로더(Class Loader) 자바언어로 작성된 클래스 파일은 JVM 위에서 동작한다. 직접 운영체제 위에서 동작하지 않기 때문에 높은 이식성을 가질 수 있게되었다. 자바의 클래스로더(ClassLoader)는 컴파일된 클래스 파일을 JVM위로 올리는(Load) 동작을 수행한다. 자바 클래스로더(Java ClassLoader) 자바는 클래스 파일을 동적으로 읽어온다. JVM이 동작하다가 클래스 파일을 참조하는 순간 동적으로 읽어서 메모리에 로드되면서 JVM에 링크 된다. 자바 클래스로더(Java ClassLoader)는 클래스들을 동적으로 메모리에 로딩하는 역할을 담당한다. 클래스 로더 로딩과정 컴파일된 .class 파일은 '로딩(Loading)', '링킹(Linking)', '초기화(Initializing)' 단계를 거쳐 JVM에서 .. 2021. 7. 13.
[책] 우리는 마약을 모른다 밀리의 서재에서 눈길을 끄는 제목의 책이 있어서 읽기 시작했다. [우리는 마약을 모른다]라는 제목의 책으로 겉표지에는 대마초 그림과 함께 '교양으로 읽는 마약 세계사'라는 소제목(?)이 달려있었다. "우리는 마약을 잘 아는가?"이 질문에 답을 하기 위해서는 "마약이란 무엇인가?"라는 정의부터해야한다. 우리가 생각하기에 마약은 '악마의 약' 정도의 느낌을 가지고 있다. 그런데 마약이라는 단어의 '마'자는 악마 혹은 마귀를 지칭하는 '마(魔)'자가 아니라 '마비시킨다'라는 의미의 '마(痲)'자라고 한다. 이 '마(痲)'자는 '삼 마(麻)' 자에서 파생된 글자라고 한다. 마약이라는 단어를 거슬러올라가면 대마초가 있나보다. 마약의 역사 아무튼 마약의 역사는 인류의 역사와 궤를 같이 한다. 기원전 3000년경 큰.. 2021. 7. 12.
[Java] 자바 스트림(Stream) 사용법 및 예제 자바 스트림(Stream) 자바의 스트림(Stream)은 'Java 8'부터 지원되기 시작한 기능이다. 컬렉션에 저장되어 있는 엘리먼트들을 하나씩 순회하면서 처리할 수 있는 코드패턴이다. 람다식과 함께 사용되어 컬렉션에 들어있는 데이터에 대한 처리를 매우 간결한 표현으로 작성할 수 있다. 또 한, 내부 반복자를 사용하기 때문에 병렬처리가 쉽다는 점이 있다. 'Java 6' 이전까지는 컬렉션의 엘리먼트들을 순회하기 위해서 Iterator 객체를 이용했다. ArrayList list = new ArrayList(Arrays.asList("a", "b", "c")); Iterator iterator = list.iterator(); while(iterator.hasNext()) { String value = .. 2021. 7. 11.
[Java] 제네릭(Generic) 사용법 및 예제 자바 제네릭 자바에서 제네릭은 데이터의 타입을 일반화하는 것을 의미한다. 클래스나 메소드에서 사용할 데이터의 타입을 컴파일 시에 미리 지정하는 방법이다. 제네릭(Generic)이라는 단어의 의미에도 '일반적인'이라는 뜻이 있다. 우리가 자바로 프로그래밍을 할 때 많이 사용하는 컬렉션 타입들이 제네릭을 구현되어 있다. 예를들어 ArrayList stringList = new ArrayList(); ArrayList integerList = new ArrayList(); ArrayList 객체의 경우 객체에서 다룰 데이터의 타입을 제네릭으로 입력하도록 되어 있다. ArrayList처럼 다양한 타입에 대해 동작하는 클래스를 구현하고 싶을 때 제네릭을 사용한다. 제네릭은 데이터의 타입을 클래스 내부에서 지정하는.. 2021. 7. 10.
[Java] jstack 사용법 - 스레드 덤프 생성 멀티 스레드 자바 애플리케이션의 경우, 수 십개의 스레드가 공유 자원에 접근을 하면서 락(lock)을 잡았다 놓았다 한다. 이 과정에서 데드락(Dead lock)이 발생하면서 시스템이 실행을 멈추는 경우가 발생할 수 있다. 혹은 속도가 느린 외부 서버에 대한 연결 요청에 대해 기다리면서 응답시간이 늦어지는 경우도 있다. 애플리케이션의 실행이 어디에서 지체되고 있는지, 어느 부분에서 막혀있는지 확인하기 위해서는 스레드 덤프를 분석해야한다. 스레드 덤프를 생성하는 방법에는 여러가지가 있지만 이번 포스트에서는 jstack을 이용해보겠다. 설치 jstack은 JDK 패키지에 기본 포함되어 있다. 따라서 ${JAVA_HOME} 경로의 bin 디렉토리만 ${PATH}로 잡아주면 실행할 수 있다. (JAVA 5 이상.. 2021. 7. 8.