표준 함수형 인터페이스를 사용하라 자바가 람다를 지원하면서 API를 작성하는 모범 사례도 변화 템플릿 메서드 패턴 → 함수 객체를 받는 정적 팩터리나 생성자를 제공 protected 메서드인 remvoeEldestEntry를 재정의 하면 캐시로 사용 가능 맵에 새로운 키를 추가하는 put 메서드는 이 메서드를 호출하여 true가 반환되면 가장 오래된 원소를 제거 재정의 removeEldestEntry를 아래와 같이 재정의하면 맵에 새로운 키가 더해질 때마다 가장 오래된 원소를 하나씩 제거 즉 가장 최근 원소 100개를 유지 protected boolean removeEldestEntry (Map.Entry eldest) { return size() > 100; } removeEldestEntry는 siz..
람다가 익명 클래스보다 나은 가장 큰 점은 간결함! 메서드 참조 자바에는 함수 객체를 심지어 람다보다도 더 간결하게 만드는 방법 merge() 해당 메서드는 키, 값, 함수를 인수로 받음 주어진 키가 맵 안에 아직 없다면 {키, 쌍} 저장 반대로 키가 이미 있다면 함수를 현재 값과 주어진 값에 적용한 다음, 그 결과로 현재 값을 덮어씀 즉, {키, 함수의 결과} 쌍을 저장 map.merge(key, 1, (count, incr) -> count + incr); merge()에 메서드 참조 적용하기 map.merge(key, 1, Integer::sum); 람다와 메서드 참조 람다로 할 수 없는 일이라면 메서드 참조로도 할 수 없지만 메서드 참조를 사용하는 편이 보통은 더 짧고 간결 람다로 구현했을 때 너..
함수 객체 예전 자바에서는 함수 타입을 표현할 때 추상 메서드를 하나만 담은 인터페이스를 사용 이런 인터페이스의 인스턴스를 함수 객체라고 하여, 특정 함수나 동작을 나타내는데 사용 함수 객체를 만드는 주요 수단은 익명 클래스 Collections.sort(words, new Comparator() { public int compare(String s1, String s2) { return Integer.compare(s1.length(), s2.length()); } } 익명 클래스의 한계 위 코드에서 Comparator 인터페이스가 정렬을 담당하는 추상 전략을 뜻하며문자열을 정렬하는 구체적인 전략을 익명 클래스로 구현 익명 클래스 방식은 코드가 너무 길다 따라서 자바는 함수형 프로그래밍에 적합하지 않았..
컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 1장 1.1 컨테이너 인프라 환경이란 컨테이너 인프라 환경은 컨테이너를 중심으로 구성된 인프라 환경 컨테이너란? 하나의 운영 체제 커널에서 다른 프로세스에 영향을 받지 않고 독립적으로 실행되는 프로세스 상태를 의미 이렇게 구현된 컨테이너는 가상화 상태에서 동작하는 프로세스보다 가볍고 빠르게 동작함 컨테이너 인프라 환경의 장점을 이해하려면 서비스의 설계 부분을 살펴보자! 1.1.1 모놀리식 아키텍처 모놀리식 아키텍처는 하나의 큰 목적이 있는 서비스 또는 애플리케이션에 여러 기능이 통합되어 있는 구조를 의미 장점 소프트웨어가 하나의 결합된 코드로 구성되기 때문에 초기 단계에서 설계하기 용이하며 개발이 좀 더 단순하고 코드 관리가 간편 단점 서비스를 운영하는 ..
Map의 메서드의 사용법에 대해 자주 헷갈리고 있는 나를 발견하면서 앞으로도 헷갈릴 때 두고두고 보기 위해 작성해봅니다! getOrDefault 구현 코드 default V getOrDefault(Object key, V defaultValue) { V v; return (((v = get(key)) != null) || containsKey(key)) ? v : defaultValue; } 메서드 이름에서 알 수 있듯이 해당하는 key의 value를 가져오거나, 만약 map에 해당하는 key가 없다면 defaultValue를 리턴하는 메서드이다. 사용 예시 아래는 모든 참가자들을 map에 저장하고 모든 완주자에 대해 map에서 제거하여 완주하지 못한 참가자들을 구하는 코드이다. HashMap map =..
Function Interface @FunctionalInterface public interface Function { R apply(T t); } 위에서 Funtion 인터페이스가 의미하는 것 T라는 Input Type을 받아 R이라는 Output Type을 반환하는 것 함수를 객체 형태로 만들기 public class Adder implements Function { @Override public Integer apply(Integer x) { return x + 10; } } Function 인터페이스를 구현하기 apply 메서드를 오버라이딩하여 원하는 함수를 구현하기 해당 함수를 사용 시에는 아래와 같이 사용할 수 있다. import chapter3.util.Adder; import java.u..
저번주, 약 6주간의 카카오테크캠퍼스 1기의 2단계가 종료되었다. 1단계(9주차)에 비해 조금 더 짧은 기간이었지만, 2단계 기간은 방학 + 매일 그리고 주차별로 진행해야 할 과제, 특강, 데일리 스크럼이 있었기에 1단계에 비해 훨씬 성장을 많이 한 것 같은,,, 개인적인 느낌이 들었다. 아무튼! 2단계도 무사히 수료하였기 때문에 회고 겸 3단계를 위한 준비차 글을 작성한다! 2단계 회고 - KPT Keep(유지할 것) 과제 및 특강, 데일리 스크럼에 성실히 참여하였다. 과제 수행 시 최대한 요구사항을 충족하기 위해 노력하였다. 실시간 강의 시간에 최대한 집중하여 효율적으로 학습하려 했다. 깃허브 과제 제출 시 궁금한 점들을 질문하였다. 틈틈히 블로깅을 통해 과정 중 있었던 일들을 기록하려 하였다. Pr..
기본키 매핑 직접 할당: 기본키를 애플리케이션에서 직접 할당 자동 생성: 대리 키 사용 방식 IDENTITY: 기본 키 생성을 데이터베이스에 위임 SEQUENCE: 데이터베이스 시퀸스를 사용해서 기본 키를 할당 TABLE: 키 생성 테이블을 사용 IDENTITY 전략 기본 키 생성을 데이터베이스에 위임 주로 MySQL, PostgreSQL 등에서 사용 개발자가 엔티티에 직접 식별자를 할당하면 @Id 어노테이션을 사용 식별자가 생성되는 경우에는 @GeneratedValue 어노테이션을 사용하고 식별자 생성 전략을 선택해야 함 사용 예시 @Entity public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Lon..
모던 자바 인 액션을 보고 리액티브 스트림스의 백프레셔는 무엇이고 왜 좋은지 라는 의문이 생겨 정리하였습니다. 참고한 글 Armeria로 Reactive Streams와 놀자! - 1 [리액티브 프로그래밍] Publisher, Subscriber 그리고 Subscription - 2 관찰자(Observer) 패턴이란? 리액티브 프로그래밍의 기초 관찰자 패턴에는 이벤트를 발생시키는 역할(주체)와 이벤트를 수신하는 역할(관찰자)가 있다. 주체(subject)는 관찰자(observer)에게 상태변경을 알려준다. 관찰자 패턴의 문제점과 결합 옵저버 패턴에서는 발행자(publisher)가 구독자(subscriber)에게 밀어 넣는 방식으로 데이터가 전달 발행자는 구독자의 상태를 고려하지 않고 데이터를 전달하는 ..
패스트캠퍼스 남궁성님 강의 보고 정리하였습니다 filter란? 공통적인 요청 전처리와 응답 후처리에 사용됨(로깅, 인코딩 등) 여러 서블릿들에서 위의 그림처럼, 공통적으로 발생하는 전처리, 후처리를 필터를 통해 중복 제거가 가능 따라서 서블릿들에서는 본래의 맡은 처리만 즉 하나의 책임만 가질 수 있게 됨 filter의 처리 과정 아래의 과정을 거쳐 요청이 처리된다고 할때 ( ->) 처리되는 과정은 다음과 같다. 요청이 오면 처음 filter1의 전처리 진행 filter2 호출 filter2 전처리 서블릿 호출 후 메서드 처리 filter2 후처리 filter1 후처리 filter의 사용 예시 아래와 같은 서블릿이 있을 때, 전처리, 후처리 등 분리해야 할 코드가 보인다. ExampleServlet.jav..