본문 바로가기

전체 글

(55)
[JAVA] 함수형 디자인 패턴 - Chapter 14 디자인 패턴은 특정한 문제 상황에 대해 어떻게 해결할 수 있을지에 대한 가이드라인을 제공하며, 검증 되어 있으며 형식화되어 반복적으로 적용 가능한 솔루션이다. 디자인 패턴은 총 세가지 그룹으로 분류가 가능하다. 생성 패턴 (Creational Patterns)객체를 생성하는 방법을 다루며, 객체 생성의 복잡성을 줄이고, 코드의 유연성을 높인다.ex) 싱글턴 패턴, 팩토리 메소드 패턴 행동 패턴 (Behavioral Patterns)객체 간의 상호작용과 책임 분배를 다룬다.객체 간의 알고리즘이나 책임을 어떻게 분산시킬지를 정의한다.ex) 옵저버 패턴, 전략 패턴  구조 패턴 (Structural Patterns)다양한 객체들이 효과적으로 조화를 이루도록 도와주며, 객체 간의 관계를 정리한다.ex) 어댑터 ..
[JAVA] 재귀 (Recursion)- Chapter 12 재귀 (Recursion)는 문제를 더 작은 단위로 나누어 해결하기 위한 접근 방식이다.자기 자신을 호출하며 변경된 인수를 사용하여 기본 조건에 도달할 때 까지 수행된다. 기본 조건실제 값을 반환하고 재귀 호출을 종료하는 조건이다. 재귀 호출기본 조건에 의해 종료될 때 까지 자기 자신을 호출 한다.  재귀 호출은 메서드 바디에서의 호출 위치에 따라 두가지로 나뉠 수 있다. 머리 재귀재귀 호출이 함수의 시작 부분에 위치한다.결괏값을 반환하기 전에 재귀 호출이 이루어져 런타임이 반환될 때 까지 최종 결괏값을 확인 할 수 없다.머리 재귀는 함수가 자신을 호출한 후에 나머지 작업을 수행해야 하므로 호출 스택이 커질 수 있다. public class HeadRecursion { public static in..
[JAVA] 함수형 예외 처리 - Chapter 10 예외와 에러의 유형자바에서는 세 종류의 제어 흐름 방해 요소가 있다.  1. 체크 예외 (Checked Exception) 체크 예외는 정상적인 제어 흐름에서는 벗어나지만,외부에서 예측할 수 있으며 가능한 경우 복구할 수 있는 예외를 의미한다. (FileNotFoundException, MalformedURLException)이를 처리하기 위해서는 catch-or-specify 요구 사항을 준수해야 한다. *catch-or-specify1) catch현재 컨텍스트에서 예외를 catch 해야 한다. (예외를 처리하는 코드 블록을 작성하여 예외를 잡고 처리)public void readFile(String filePath) { try { BufferedReader reader = new B..
[Spring Security] Redis에 refreshToken 저장 시 공백 이슈 redisTemplate을 이용하여 리프레시 토큰을 저장 할 때, 이상하게 토큰 값 앞에 공백이 왕창 박혀서들어온 토큰 값이랑 redis에 저장된 토큰 값이랑 비교가 안되었던 오류가 발생하였다. 인코딩, 디코딩 문제인줄 알았으나 확인 결과 아니었고,임시로 trim()으로 문자열을 비교해 테스트 코드를 통과시키긴 했지만 찝찝했다. 다시 시간을 두고 살펴본 결과 redisTemplate의 ValueOperations의 set 메소드가 다양한 오버로딩을 지원하고 있었고,세번째 인수 타입에 의한 이슈였다. public RefreshToken save(RefreshToken refreshToken) { redisTemplate .opsForValue() ..
[JAVA] Optional을 사용한 null 처리 - Chapter 09 이번 장에서는 자바가 null 참조를 어떻게 다루는지,그것을 Optional이나 함수형 API를 통해 어떻게 개선해야 할 지를 다룬다. Null 참조의 문제점값의 부재시,원시 타입은 기본값으로 처리하고, 비원시타입의 경우 기본값으로 null로 처리한다. null은 단순히 값이 없는 상태가 아니다.실제 타입과 관계없이 어떠한 객체 참조와도 호환되는 타입이다.이 때, null 참조에 접근하려고 시도하면 NullPointException이 발생한다. 또한 null은 타입 모호성을 갖고 있다.구체적인 타입이 없어 모든 타입을 대표 할 수 있다.+ null일경우 해당 타입이 무엇이든 instanceof를 사용하여 확인 시 항상 false를 반환한다.자바에서 null을 다루는 방법 (Optional 도입 전)1) ..
[JAVA] 스트림 (Stream)을 활용한 병렬 데이터 처리 - Chapter 08 동시성 VS 병렬성동시성여러 작업이 중복된 시간 동안 한정된 리소스에 대한 경쟁을 하면서 실행되는 것작업들을 스케쥴링 하고 작업 간 실행을 전환해가면서 동시에 실행되지는 않지만, 동시에 실행되는 것 처럼 보인다.스레드 안전 (Thread-safe) 하게 설계 되어야 한다 (락, 세마포어 등) 병렬성작업들이 동시에 실행되는 것각각의 작업들이 병렬적으로 동시에 실행되는 것   병렬 스트림중간 스트림 연산인 parallel 혹은 Collection 타입 기반에서 parallelStream 메서드를 통해 파이프 라인을 병렬 모드로 전환 할 수 있다.다시 순차 스트림으로 돌아가려면 중간연산인 sequential을 사용하면 된다.(다만 실행 모드 변경 시에는 파이프라인 위치에 관계없이 전체 파이프라인에 영향을 미친..
[JAVA] 스트림 (Stream) - Chapter 06 이번 장은 스트림에 대해 다뤘다.스트림을 종종 써왔지만, 내부 동작에 대해서는 자세히 몰랐기 때문에 이번장은 꽤 어려웠다. 스트림1) 스트림은 선언적이고 지연 평가된 접근법을 제공한다.2) 내부 반복을 가진 데이터 파이프라인으로, 반복 같은 어떻게 수행되는지는 데이터 소스가 담당하도록 하고, 무엇을 하고싶은지를 집중 할 수있게 한다. (스스로 반복을 수행하는 파이프라인을 사전에 구성)3) 스트림의 연산들은 java.util.stream.Stream의 메서드로 제공되는 고차 함수로 이루어져 있어, 중간 연산은 새로운 스트림 함수를 return하기 때문에 여러 스트림 함수를 조합하여 사용 할 수 있다.4) 결과를 반환하는 최종 연산때까지 지연 처리되어 (중간 연산 때 즉각적으로 실행 X, 종료 연산 호출 전..
[JAVA] 레코드 (Record) - Chapter 05 함수형 프로그래밍 자바의 5장에서 다루는 레코드에 대해 정리해 보았다. 레코드 (Record)레코드란 자바 14에서 도입된 데이터 집계 유형 중 하나이다.가장 대표적인 데이터 집계 유형에는 튜플이 있다.레코드는 명목상 튜플과 마찬가지로, 순서대로 정렬된 값의 시퀀스를 집계하여 인덱스 대신 이름을 통해 데이터에 접근 할 수 있다.또한 다른 클래스와 구분하기 위해 새로운 키워드인 record를 사용한다. 아래에서 불변 POJO 객체인 User객체와 record를 통해 생성된 User를 비교해 보자. 간단한 User POJO 객체public final class PojoUser { private final String userName; private final LocalDateTime lastLogin; pu..