분류 전체보기 55

람다와 함수형 프로그래밍의 원리와 활용

이펙티브 자바를 읽고 람다에 대해 다시 한 번 정리하고자 글을 적게 되었다.    람다를 들어가기 앞서 함수형 프로그래밍에 대해서 먼저 알아보자.함수형 프로그래밍은 순수함수를 기반으로 상태 변경과 부작용을 최소하하여 코드를 작성하는 프로그래밍 패러다임이다.이 패러다임은 데이터를 변형하는 대신 함수 조합을 통해 작업을 수행하며, 함수가 일급 객체로 취급된다. 즉, 함수를 다른 함수에 인자로 전달하거나 반환값으로 사용할 수 있고, 이를 통해 더 직관적이고 유지보수가 쉬운 코드를 작성할 수 있다.이와 같은 함수형 프로그래밍의 접근 방식을 자바와 같은 객체지향 언어에서 구현하기 위해 등장한 것이 바로 람다 표현식이다.   함수형 프로그래밍 특징1. 순수함수동일한 입력이 주어지면 항상 동일한 출력을 반환하는 함수..

Java 2025.01.07

버블 정렬 Bubble Sort 알고리즘

정렬 알고리즘 중 하나로, 인접한 두 요소를 비교하고 필요에 따라 자리를 교환하면서 배열을 정렬하는 방식이다. 동작 방식배열의 첫 번째 요소와 두 번째 요소를 비교한다.첫 번째 요소가 더 크면 두 요소와 자리를 바꾼다.그런 다음 두 번째 요소와 세 번째 요소를 비교한다.이 과정을 배열 끝까지 반복한다. 한 번의 반복이 끝나면 가장 큰 요소가 배열의 마지막 자리에 위치한다.두 번째 반복에서는 마지막 요소는 이미 정렬되어있기 때문, 그 전까지만 반복한다.위의 과정을 배열이 정렬될 때까지 반복한다.구현public class 버블정렬 { public static void main(String[] args) { int[] array = {5, 3, 8, 4, 2}; bubbleSor..

Algorithm 2025.01.07

Backtracking

가능한 모든 경우의 수를 탐색하는 알고리즘 기법모든 가능한 경우의 수 중에서 특정 조건을 만족하는 경우만 탐색한다. 조건을 만족하지 않으면 이전 단계로 돌아가 다른 해를 탐색한다. 불필요한 경로를 빨리 제거할 수 있어, 효율적이다. 해를 부분적으로 구성해 나가면서, 해당 해가 유망하지 않은 경우 탐색을 중단하고 이전 단계로 돌아간다.각 단계에서 선택을 하고, 그 선택에 따라 다시 문제를 재귀적으로 탐색한다.Pruning 가지치기 동작가능한 해를 하나씩 만들며 조건을 만족하는지 확인한다.각 단계에서 유망성을 확인한다.유효하지 않으면 해당 경로의 탐색을 중단하고 이전 단계로 돌아간다.유효한 해인 경우 결과에 추가한다.위의 과정을 반복하여 가능한 모든 경오를 탐색한다. 구현 예시숫자 n이 주어졌을 때, n개의..

Algorithm 2025.01.07

DI(Dependency Injection)

객체 간의 의존성을 외부에서 주입하여,객체 간의 결합도를 낮추고, 코드의 재사용성과 유연성을 높이는 패턴 객체가 직접 의존성을 생성하거나 관리하는 대신, 외부에서 필요한 의존성을 주입받아서 사용하기 때문에, 사용할 객체의 구현을 몰라도 되고, 인터페이스나 추상 타입에 의존한다.   강합 결합한 클래스가 다른 클래스의 구현에 직접적으로 의존하는 상황으로, 두 클래스 간의 관계를 변경하거나 유지보수가 어렵다.public class Engine { public void start() { System.out.println("Engine start!"); }}public class ElectricEngine extends Engine { @Override public void s..

Spring 2025.01.07

람다 표현식과 함수형 인터페이스

람다 표현식은 자바의 메서드를 하나의 식으로 간결하게 표현한 것이다.이전에는 자바에서 메서드를 표현하려면 클래스를 정의해야 했지만, 자바 8 부터 람다식을 이용해 메서드의 이름과 반환 값을 생략할 수 있고, 이를 변수에 넣어 코드를 간결하게 한다. int add (int a, int b) { return a + b; }// 아래와 같이 변경할 수 있다.(a, b) -> a + b;   (매개변수) -> {함수 본문} 의 형태로,매개 변수가 없는 경우 () 를 사용하고, 매개 변수가 하나 인 경우 괄호를 생략할 수 있으며, 함수의 본문이 하나인 경우 중괄호와 return을 생략할 수 있다.// 매개변수가 없고, 표현식이 하나() -> System.out.println("hello"):// 매개 변수가..

Java 2025.01.07

Mysql의 LIKE 연산자 와 full-scan

Mysql의 LIKE 연산자는 문자열을 비교하는 데 사용된다.패턴 매칭을 통해 특정 문자열이 포함된 레코드를 검색하며, % 와 _를 사용한다.% : 0개 이상의 문자와 일치_ : 정확히 1개의 문자와 일치SELECT * FROM users WHERE username LIKE 'john%'; -- 'john'으로 시작하는 모든 사용자 이름 검색SELECT * FROM users WHERE username LIKE '%doe'; -- 'doe'로 끝나는 모든 사용자 이름 검색SELECT * FROM users WHERE username LIKE '_o_'; -- 두 번째 문자가 'o'인 모든 사용자 이름 검색  문제LIKE 연산자는 와일드 카드를 사용하여 패턴 매칭을 한다. 와일드 카드가 패턴의..

DB 2025.01.07

@Transactional과 Proxy

@Transactional은 메서드 실행 전후에 트랜잭션을 시작하고 커밋 또는 롤백하는 기능을 제공하는 어노테이션으로, 스프링에서 트랜잭션 관리를 자동으로 처리한다.  @Transactional의 트랜잭션 동작1. 트랜잭션 시작:@Transactional이 적용된 메서드를 호출할 때, 먼저 PlatformTransactionManager를 사용하여 트랜잭션을 시작한다.트랜잭션 메니저는 트랜잭션 경계를 설정하고, 데이터베이스와의 연결을 트랜잭션 모드로 전환다.이를 통해 해당 메서드가 트랜잭션 내에서 실행되도록 한다.2. 트랜잭션 커밋:메서드가 정상적으로 완료되면 TransactionManager는 트랜잭션을 커밋한다.3. 트랜잭션 롤백:메서드 실행 중, Checked Exception 외의 예외(런타임 예..

Java 2025.01.07

Transaction

DBMS에서 데이터의 무결성을 보장하기 위한 개념으로, 하나 이상의 데이터베이스 연산을 묶어서, 하나의 작업 단위로 처리하는 것을 의미한다. 여러 연산이 모두 성공해야 커밋되어 데이터베이스에서 반영되고, 하나라도 실패할 경우 롤백하여 이전 상태로 되돌려 데이터의 일관성을 유지한다.   트랜잭션은 ACID 기반으로 동작하여 데이터베이스 시스템은 오류, 하드웨어 장애, 그리고 다른 트랜잭션과의 충돌 상황에서도 데이터의 정확성과 안정성을 보장한다.  트랜잭션의 특징 (ACID)Atomicity 원자성한 트랜잭션 내의 모든 연산들이 완전히 수행되거나, 전혀 수행되지 않아야 함을 의미한다. 트랜잭션이 부분적으로 실행되는 것을 방지하는 특성이다. ( All or Nothing )Consistency 일관성트랜잭션이..

Java 2025.01.07

JSON Web Token

프로젝트 중에 JWT를 사용하여서 잘 몰라서.. 공부하고자   HTTP는 웹에서 클라이언트와 서버 간의 통신을 가능하게 하는 규칙이다. 하지만 통신 후 연결을 유지하지 않고, 상태를 저장하는지 않기 때문에, 사용자 매번 인증 과정을 반복해야 하는 불편함이 있다.  상태를 유지하기 위해 쿠키와 세션 방식이 나왔다. 하지만 쿠키는 보안에 취약하고 세션은 접속자가 많아질 경우 서버에 부하가 증가하게 된다. 그리고 다중 서버 시 세션 공유 문제가 발생할 수 있다.  이러한 문제를 해결하기 위해 RESTful API와 같은 stateless 아키텍처가 요구하는 인증 방식으로 JWT(JSON Web Token)가 등장했다. JWT는 사용자 정보를 담고 있는 JSON 형식의 토큰으로, 서버가 상태를 저장할 필요 없이..

Spring 2025.01.07