Java

    플라이웨이트 패턴 (Flyweight Pattern) 이란?

    플라이 웨이트 (Flyweight) 패턴이란? 구조와 관련된 디자인 패턴이다. 변화하지 않는(intrinsic) 재사용 가능한(resuable) 커다란 객체를 캐시에 저장해두고 재활용하는 기법이다. 여러 개의 클래스 내부 필드 중 공통으로 사용되는 필드를 따로 빼내어 공유하여 메모리를 더 확보할 수 있게 해준다. flyweight 의 영단어 뜻은 스포츠에서 아주 가벼운 체급을 말한다. 필드의 중복을 최적화할 수 있어서 많은 인스턴스를 만드는 애플리케이션에서 효율이 좋다. OOM 현상을 방지하는데 유용하다. 자주 변경되는 속성 (Intrinsic State) 과 자주 변경되지 않는 속성 (Extrinsic State) 을 분리하여 자주 변경되지 않는 것을 재사용한다. 객체지향적 디자인이 목적이라기보다 성능..

    톰캣에서 지원하는 HttpSession 이란? (feat. Servlet API)

    Tomcat 에서 지원하는 Http 세션 (HttpSession) 이란? HttpSession 은 자바 서블릿 API 에 의해 제공된다. 유저를 식별하고 각 유저에 맞는 정보를 저장할 수 있게 해준다. 톰캣 내부에 구현이 있다. 톰캣은 오픈소스 웹서버이고 서블릿 컨테이너이다. 자바 서블릿과 자바 서버 페이지 (JSP) 스펙을 구현한다. HttpSession 인터페이스의 기능 서블릿 API 에 의해 제공되어 세션 식별자, 생성 시간, 마지막으로 엑세스한 시간 등 세션에 대한 정보를 보거나 조작하게 해준다. 객체를 세션에 바인딩하여 여러 사용자 연결에 걸쳐 사용자 정보를 유지할 수도 있다. 어떻게 동작하는가? 세션 생성 세션 ID 세션 속성 세션 타임아웃 세션 추적 세션 생성 (Session Creation..

    퍼사드 패턴 (Facade Pattern) 이란?

    퍼사드 패턴 (facade pattern) 라이브러리 혹은 프레임워크에 간소화된 인터페이스를 제공하는 패턴이다. 클래스의 복잡한 시스템에 간소화된 인터페이스를 제공한다. 클래스를 직접 사용하지 않는 것이 포인트이다. 퍼사드란 건물의 대문같은 입구를 말한다. 또 여기엔 내부 구조를 숨긴다는 의미도 내포되어 있다. 복잡한 서브 시스템을 최대한 숨겨 의존성을 최소화하는 방법이다. 자바 이메일 코드로 보는 퍼사드 패턴 예제 기존의 코드 아래의 코드도 잘 돌아가며 잘못된 부분은 없다. 그러나 몇가지 단점이 있다. 테스트하기에 약간 힘든 코드이다. 코드의 의도를 이해하기 위해 기술적인 부분까지 봐야 한다. public class Client { public static void main(String[] args) ..

    인텔리제이 콘솔에서 톰캣 한글 로그가 깨질 때 해결 방법

    증상 체크 톰캣 서버를 띄웠는데, 콘솔에서 한글이 잘 찍히지 않는다. 초기화 과정에서 나오는 메세지가 깨져서 나온다. 기본 Intellij 콘솔 인코딩 깨짐 해결 아래의 화면처럼 깔끔한 초기화 로그가 뜨지 않고 여러 문자가 깨져보일 때 해결하는 방법이다. Intellij File Encodings 체크 상단부터 차례대로 체크해본다. 통신에는 UTF-8 이 가장 범용적으로 사용되므로 UTF-8 로 모두 고정해주는 것이 좋다. 가변길이 인코딩으로 통신 시 공간효율이 좋다. Global Encoding, Project Encoding, Default encoding for properties files 아래의 Transparent native-to-ascii conversion 도 체크하는 것이 좋다. 네이티..

    이펙티브 자바, 쉽게 정리하기 - item 47. 반환 타입으로는 스트림보다 컬렉션이 낫다

    이펙티브 자바, 쉽게 정리하기 - item 47. 반환 타입으로는 스트림보다 컬렉션이 낫다 Java8 이후 원소 시퀀스를 반환하는 방법 기존에는 Collection, Iterable 이라는 선택지가 존재했다. Java8 이후로는 Stream 이라는 선택지가 하나 더 늘었다. Stream 은 반환 타입으로 사용하기보다는 단순히 컬렉션 처리를 위해 사용하는 것이 좋다. 반환은 다시 컬렉션으로 변경해주는 것이 활용성이 좋다. someStream.collect(Collectors.toList()) 와 같은 함수를 이용하면 쉽다. Stream 이 Iterable 을 확장하지 않는데서 생기는 문제 기존에 Stream 의 forEach() 는 Consumer 인터페이스를 사용하는 만큼 값을 생산하기보다 소비하는데에 ..

    자바 Stream 에 size() 혹은 length 프로퍼티가 없는 이유

    Stream 에 size() 혹은 length 가 존재하지 않는 이유 아래의 개념을 알기 전에 앞서 스트림에서 평가(evaluation) 란 무엇인지 알아야 한다. Stream 은 게으르게 프로세스를 처리하도록 설계되어 있다. Stream 은 각 원소가 실제로 필요할 때까지 평가(evaluation) 하지 않는다. 큰 데이터 셋을 처리하는 경우, 이 접근 방식이 매우 효과적이다. 실제로 평가되기 전까지 데이터의 변환이 더 있을 것이라 가정하고 크기를 반환하는 size() 혹은 length 같은 프로퍼티를 제공하지 않는다. 대신 count() 메서드를 호출하면 스트림을 소모하여 전체 데이터 개수의 숫자를 반환한다.

    이펙티브 자바, 쉽게 정리하기 - item 46. 스트림에서는 부작용 없는 함수를 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 46. 스트림에서는 부작용 없는 함수를 사용하라 스트림의 핵심 스트림은 사용법을 아는 것만으로 충분하지 않다. 패러다임을 받아들여야 한다. 패러다임의 핵심은 계산을 일련의 변환으로 재구성하는 부분이다. 변환 과정에 사용되는 함수는 순수함수여야 한다. 스트림을 이용한 코드의 진화 과정 단어 개수 세기 1: 사용법만 아는 단계 @Test public void wordFreq1Test() { List words = new ArrayList(); words.add("stop"); words.add("spot"); words.add("trim"); words.add("meet"); words.add("ball"); words.add("free"); words.add("t..

    이펙티브 자바, 쉽게 정리하기 - item 44. 표준 함수형 인터페이스를 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 44. 표준 함수형 인터페이스를 사용하라 람다를 활용할 때 표준 함수형 인터페이스를 사용하자 자바에서는 람다에 활용하라고 미리 만들어둔 표준 함수형 인터페이스들이 존재한다. removeEldestEntry()의 예 protected boolean removeEldestEntry(Map.Entry eldest) { return size() > 100; } LinkedHashMap 내부 메서드이다. 맵의 키 밸류 조합이 100개가 넘을 때, true를 반환한다. 잘 보면 약간 이상한점이 있는데, eldest라는 맵의 Entry를 파라미터로 받아놓곤, size()를 활용한다. 이 파라미터가 있는 이유는 이 메서드를 오버라이드할 때를 대비해서이다. 람다 인터페이스를 사..

    자바 함수형 인터페이스 혹은 람다 인터페이스란?

    함수형 인터페이스 혹은 람다 인터페이스 (Functional Interface, Lambda Interface) 란? 공식 API 문서 람다 인터페이스와 함수형 인터페이스는 같은 말이다. 단 하나의 추상 메서드만 가지는 인터페이스를 함수형 인터페이스라고 한다. 함수형 인터페이스를 구현하여 손쉽게 람다 표현식을 작성할 수 있다. Stream API 와 같이 사용하는 방식도 많이 이용된다. 자바에서는 자체적으로 많은 표준 함수형 인터페이스를 제공한다. 따로 만들기보단 제공하는 것을 이용하는 것이 좋다. 표준 함수형 인터페이스 살펴보기 Predicate 임의의 타입 T 의 인자를 받아 boolean 을 반환하도록 설계되어 있다. Predicate isPositive = num -> num > 0; Functi..

    이펙티브 자바, 쉽게 정리하기 - item 45. 스트림은 주의해서 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 45. 스트림은 주의해서 사용하라 스트림의 특징 아래에서 사용하는 평가(evaluation) 란 용어를 사용한다. 이 용어에 대한 설명은 Java Stream API 에서 평가 (evaluation) 란? 포스팅을 참조하면 된다. 배열과 같은 시퀀스형 데이터를 처리하는데 특화되어 있다. 소스 스트림(source stream) -> 중간 연산(intermediate operation) -> 종단 연산(terminal operation) 순으로 진행된다. 각 중간 연산(intermediate operation) 은 스트림을 어떠한 방식으로 변환(transform) 한다. 스트림 파이프라인은 지연평가되며, 평가는 종단 연산(terminal operation) 이 호출..

    Java Stream API 에서 평가 (evaluation) 란?

    스트림에서 평가(evaluation) 란? 스트림에서 종종 평가(evaluation) 라는 용어를 사용한다. 평가는 병렬 처리가 가능한 Stream 형태에서 Stream 이 아닌 다른 형태의 자바 객체로 바꾸는 행위를 말한다. toArray(), collect(), reduce(), forEach() 같이 Stream 타입이 아닌 자바 객체로 변환하고 이를 반환하는 것을 말한다. Stream 은 평가 전에는 계속 스트림 형태를 유지한다. findFirst(), anyMatch(), allMatch() 또한 평가(evaluation) 를 트리깅할 수 있다. 하지만, 오직 단락 조건 (short-circuiting condition) 이 맞을 때만 가능하다. 단락 조건 (short-circuiting con..

    web.xml 에서 사용하는 absolute-ordering 이란?

    absolute-ordering 이란? Servlet 3.0 명세에서 도입된 기능이다. 어떤 web fragments 가 먼저 처리되어야 하는지 개발자가 직접 정의할 수 있는 기능이다. web fragments 란, 메인 웹 애플리케이션과 독립적으로 패키징하고 배포할 수 있는 웹 앱의 모듈적 단위이다. WEB-INF 내부 lib 디렉토리에 있는 JAR 파일들이 web fragments 의 예이다. 순전히 optional 한 엘리먼트이며, 존재하지 않는 경우 기본 값으로 처리된다. 기본값은 발견된 순서이다. 어떻게 동작하는가? 웹 앱이 배포되면, 웹 컨테이너는 web.xml 을 읽고 모든 web fragments 를 모아 하나의 통합된 웹 앱으로 만든다. 기본 값은 웹 컨테이너에 의해서 발견된 web fr..

반응형