암호화는 보안 시스템의 핵심이다. 단순히 데이터를 숨기는 수준을 넘어, 정보의 기밀성·무결성·인증·부인방지를 달성하기 위한 핵심 기술이다. 이 글에서는 실무 개발자가 반드시 이해하고 있어야 할 암호화 개념과 구현 시 고려사항을 체계적으로 정리한다.1. 암호화의 목적과 보안 속성암호화를 설계하거나 적용할 때는 “왜 암호화하는가”에 대한 명확한 이해가 필요하다.보안은 단일 기능이 아니라 여러 속성이 맞물려 작동한다.속성 설명기밀성 (Confidentiality)권한 없는 사용자가 데이터를 볼 수 없도록 보호한다.무결성 (Integrity)데이터가 전송·저장 중 변조되지 않았음을 보장한다.인증 (Authentication)데이터를 보낸 주체가 누구인지 확인할 수 있다.부인방지 (Non-repudiation)데..
자바는 전통적으로 객체지향 프로그래밍(OOP) 언어로 알려져 있습니다. 하지만 Java 8부터 함수형 프로그래밍(Functional Programming, FP) 을 지원하면서 코드의 간결성과 유지보수성을 높일 수 있는 새로운 패러다임이 도입되었습니다.이번 글에서는 기초 개념부터 고급 활용까지 자세히 살펴보며, 실제 예제와 함께 자바에서 함수형 프로그래밍을 어떻게 적용할 수 있는지 알아보겠습니다.1. 함수형 프로그래밍이란?함수형 프로그래밍은 부수 효과(side-effect)를 최소화하고, 상태를 변경하지 않으며, 함수를 일급 객체로 다루는 프로그래밍 스타일입니다.일급 객체(First-class Citizen): 함수도 변수처럼 다룰 수 있습니다.순수 함수(Pure Function): 동일한 입력에 대해 ..
들어가며최근 팀에서 회원가입 로직 리팩토링 중, 기존 테스트 케이스 정리하는 작업 담당이상하게도 어떤 테스트는 단독 실행 시 성공하지만, 전체 테스트를 돌리면 실패하는 현상 발생로그를 뒤져보고, 디버깅까지 해도 로직에는 문제가 없었음, 원인은 Spring의 ApplicationContext 공유 때문으로 확인문제 상황예시코드 (회원가입 성공)@SpringBootTestclass MemberServiceTest { @Autowired private MemberService memberService; @Test void 회원가입_성공() { MemberRequest req = new MemberRequest("uijin", "pass123"); Member me..
가비지 컬렉션(Garbage Collection)가비지 컬렉션은 프로그래밍에서 더 이상 사용하지 않는 메모리, 즉 "쓰레기"가 된 메모리를 자동으로 회수하여 재활용하는 프로세스이다. 이는 개발자가 명시적으로 메모리를 해제해야 하는 부담을 덜어주고, 메모리 누수와 같은 문제를 예장하는 데 중요한 역할을 한다.가비지 컬렉션의 기본 원리가비지 컬렉션의 핵심 원리는 어떤 메모리 객체가 아직 사용되고 있는지, 아닌지를 판단하고 사용되지 않는 객체가 차지하고 있는 메모리를 회수하는 것이다. 가비지 컬렉션의 기본 원리는 다음과 같다.객체 추적 : 가비지 컬렉터는 프로그램 내의 모든 객체를 추적하고 관리한다. 각 객체가 어떤 변수나 다른 객체에 의해 참조되고 있는지 여부를 파악한다.도달 가능성 판단 : 가비지 컬렉터는..
Java 17의 등장Java 17 버전은 2021년 9월에 공개된 LTS(Long Term Supports) 버전으로 Java 11 LTS 등장이후 3에 등장한 LTS 버전이다.이번 Java 17버전의 다양한 변화사항중 눈에 띄는 점은 새로운 객체지향 패러다임을 제시하는 문법이 추가되었다는 점인데, 각각 Record, Seald Class이다. 이번 글에서 각각의 문법에 대해 자세히 알아보려 한다.RecordRecord 클래스는 데이터를 보유하는 데 특화된 간결한 클래스 선언 방식이다.전통적인 Java 클래스에서는 반복적으로 작성해야하는 보일러 플레이트(Boiler Plate)코드들이 다수 존재하는데, Record 클래스를 통해 해당 코드들을 자동으로 생산하도록 하여 개발자의 생산성을 크게 향상시킬 수 ..
MSA 환경에서 서비스 간의 데이터 일관성을 보장하는 것은 복잡한 문제입니다. 특히 여러 서비스에 각각 다른 데이터베이스가 존재하며 트랜잭션을 유지해야하는 상황에서 ACID 원칙을 지키는 것은 쉽지 않습니다. 이 기술적 문제를 해결하기 위하여 SAGA 패턴을 적용하여 Kafka 기반의 분산 트랜잭션을 구현하는 미니 프로젝트를 진행하고 글로 정리하였습니다. 프로젝트 전체 코드는 아래 github을 통해 확인할 수 있습니다.https://github.com/kwj2435/spring-redis-stock-managerSAGA 패턴SAGA는 '이야기' 혹은 '서사'라는 뜻을 가진 영어단어입니다. 단어의 뜻과 같이 SAGA 패턴의 분산 트랜잭션은 2PC(Two-Phase Commit)와 같은 전통적인 트랜잭션 ..
이슈 사항Dev, PJ, QA, Stage 환경에서 이슈 발생시 원인 파악을 위해 보통 Local 환경으로 해당 이슈를 가져와서 디버깅을 진행해당 문제를 Local에서 재현 및 원인파악을 위한 리소스가 적지 않게 필요문제가 발생한 환경에 직접 붙어서 디버깅을 하고 싶다는 니즈를 해결하기위한 방법을 고민JDWP(Java Debug Wire Protocol)와 설정Java 에서는 JDWP를 통해 디버거와 JVM간 통신을 지원해준다.1. 원격 디버깅 설정원격 디버깅을 활성화하려면 JVM 옵션에 디버깅 관련 설정을 추가해야한다. Java8과 Java9 이상에서의 설정 방식이 약간 다르다.Java 실행 옵션에 아래 옵션을 추가한다.Java 8java -agentlib:jdwp=transport=dt_socket,..
들어가기 앞서최근 JVM을 보완하는 새로운 가상머신이 개발되었고 생각보다 많은 서비스에서 사용중이라는 소식을 들었다.Java는 다른 컴파일러 언어에 비해 느리다는 이야기를 들었고, 그 원인이 JVM에서 비롯되었다고 익히 알고 있던 와중 보완된 JVM을 통해 Java의 성능 문제를 해결할 수 있다는 사실에 흥미를 가지고 살펴 보았다. 기존 JVM의 한계사실 Java의 시작을 함께한 JVM을 대체하기 위한 시도는 과거에도 빈번했다.C, C++, Golang과 같은 컴파일러 기반의 언어는 컴파일 과정에서 바로 기계어로 번역되고 실행 파일을 만들어낸다. 그리고 컴파일 시에 코드 최적화까지 진행하여 인터프리터 대비 뛰어난 성능을 가지고 있다. 반면, Java는 플랫폼 종속적인 문제를 해결하기 위해 인터프리터(In..