이끌든지 따르든지 비키든지

전체 글 67

[Java] Optional

Java 8에서 도입된 클래스로 값이 존재하지 않을수도 있는 상황을 명시적으로 처리하기 위해 사용합니다.  Optional 객체 생성하기Optional.of(value): 값이 반드시 존재할 때 사용합니다. 값이 null이면 NPE가 발생합니다.Optional.ofNullable(value): nullable한 값을 감싸 Optional 객체를 생성할 때 사용한다.  Optional 객체에서 값 획득하기get() 호출: 값을 바로 가져오기 시도한다. 값이 존재하면 반환하지만, 없으면 NoSuchElementException이 발생  isPresent() → get(): 값의 존재 여부를 확인하고 가져오는 방식으로 사용 / 일반적인 null 체크와 다를 게 없으므로, Optional의 효용이 떨어질 수 있..

카테고리 없음 2025.03.14

[Spring & JPA] EntityListener에 Bean 주입하기

JPA의 EntityListener는 엔티티의 라이프사이클 이벤트(pre-persist, post-update 등)에 대해 특정 작업을 수행할 수 있도록 도와줍니다. 그런데, 일반적으로 JPA EntityListener는 Spring 컨테이너의 관리 대상이 아니므로, Spring Bean을 직접 주입받기 힘든 구조입니다. 때문에 다음과 같은 기법들을 통해 간접적으로 Bean을 주입하는 방법을 생각할 수 있습니다.  방법1: @Configurable 사용하기 @Configurable 어노테이션은 AspectJ와 같은 AOP와 함께 사용되어, JPA가 직접 생성한 객체에도 Spring의 의존성 주입을 적용할 수 있도록 해줍니다.  1. Bean을 주입할 클래스에 @Configurable 적용@Configur..

Framework/Spring 2025.02.10

[Spring] Java Bean 규약과 JSON 직렬화 문제

최근 서비스에서 캐시 기능을 구현하다가, 흥미로운 문제를 마주했습니다. isTypeA()라는 단순한 메서드를 추가했을 뿐인데,캐시된 데이터를 불러오는 과정에서 typeA라는 필드를 찾을 수 없다는 오류가 발생한 것입니다.  원인 이는 Java Bean 명명 규약과 관련이 있었습니다.Java에서는 is로 시작하는 메서드를 boolean 타입 필드의 getter로 인식하는데, Jackson 라이브러리가 이 규약에 따라 JSON 변환을 수행하다 보니 발생한 문제였습니다.  Java Bean 명명 규약 Java Bean 규약에 따르면, is로 시작하는 메서드는 boolean(primitive) 타입 필드의 getter로 인식된다. · isActive() → active 필드의 getter로 해석· isEnabl..

Framework/Spring 2024.09.03

[JPA] @Converter 암호화를 사용해 데이터베이스 보안 강화하기

데이터베이스에 중요한 정보를 보관할 때, 보안은 필수적인 요소입니다.  특히, 개인정보와 같은 민감한 데이터를 저장할 때는 암호화를 통해 보안을 강화하는 것이 중요합니다.  JPA를 사용하여 데이터베이스에 저장되는 데이터를 안전하게 암호화하고 복호화하는 방법에 대해 알아보겠습니다.  @ColumnTransformer 첫 번째 방법은, @ColumnTransformer 어노테이션을 사용하는 것입니다. @Entitypublic class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "email") @ColumnTransformer( read = ..

Framework/JPA 2024.08.24

Gradle의 의존성 구성

빌드 자동화 도구인 Gradle은 의존성 관리를 위해 다양한 구성 옵션을 제공하는데, 주로 사용되는 종속성 구성 방법에 대해 자세히 알아보겠습니다. 주요 의존성 구성 옵션 implementation 프로젝트의 기본적인 종속성을 선언하는 데 사용됩니다. 이 옵션을 사용하면 선언된 의존성은 컴파일 시점과 런타임 시점에 모두 포함됩니다.  testImplementation 테스트 코드에서만 사용될 의존성을 선언할 때 사용됩니다. 이 의존성은 테스트 컴파일 및 테스트 실행 단계에서만 사용됩니다.  compileOnly 컴파일 시점에만 필요한 의존성을 선언할 때 사용됩니다. 런타임 시점에는 해당 의존성이 포함되지 않습니다.  develomentOnly 개발 환경에서만 사용되는 의존성을 선언할 때 사용됩니다.주로 ..

Framework/Spring 2024.07.21

URI와 URL

URI(Uniform Resource Identifier)란?정의URI는 인터넷상에서 특정 자원을 고유하게 식별할 수 있는 표기법으로, 다양한 자원을 명확히 지칭하기 위해 설계된 표준 방식입니다. 모든 자원을 유일하게 구별할 수 있는 고유한 식별자이다. URI의 범위URI는 크게 두 가지 형태로 나눌 수 있습니다.URL(Uniform Resource Locator)URN(Uniform Resource Name) URL 정의URL은 특정 자원의 위치(Location)를 정확히 나타내기 위해 사용하는 URI의 하위 개념으로, 웹 브라우저나 기타 클라이언트가 자원에 접근하는 방법(프로토콜)을 포함한 실제 위치 정보를 제공합니다. URL의 구성 요소프로토콜(Protocol)자원에 접근하는 방식이나 규칙을 나타냅..

[Web] HTTP의 버전별 특징

HTTP/0.9개요도입 연도: 1991년주요 특징:단순히 HTML 파일만 전송 가능한 단일 요청-응답 모델GET 요청만 지원헤더(Header)와 상태 코드(Status Code) 미지원장점/한계:프로토콜이 매우 단순하여 구현이 쉬웠으나, 기능 확장이 어려웠고 다양한 콘텐츠 전송이 불가능HTTP의 시작점이 된 버전으로, 텍스트 기반의 HTML 문서를 가져오기 위해 만들어졌다.당시 웹의 규모가 크지 않아 이 정도로도 충분HTTP/1.0개요도입 연도: 1996년주요 특징:상태 코드(Status Code)와 헤더(Header)의 도입다양한 콘텐츠 타입 전송 가능 (이미지, 텍스트, 기타 파일 등)클라이언트-서버 간 상태 정보 교환 가능 (Cookie, Session 등)장점/한계:이전 버전 대비 확장성과 활용도..

[Spotless] 클릭 한 번으로 코드 정리하기

Spotless란?코드 스타일 규칙을 자동으로 적용하여 코드베이스의 일관성 유지를 도와주는 오픈 소스 도구입니다.Gradle 플러그인으로 쉽게 통합할 수 있으며, Java, Kotlin, Groovy, Scala, Python, C, C++, Markdown, JSON, XML 등을 지원합니다.  Spotless를 의존성에 추가하기// build.gradleplugins { id 'java' id 'com.diffplug.spotless' version '6.25.0'}repositories { mavenCentral() gradlePluginPortal()}  Spotless를 사용하려면, Gradle 플러그인 포털에 대한 정보를 추가해주어야 합니다.gradlePluginPorta..

[PostgreSQL] PostGIS로 쉽고 빠르게 지리적 거리 계산하기

웹 애플리케이션에서는 사용자 경험을 향상하기 위해 지리적 위치 데이터를 활용하는 경우가 많습니다.예를 들어, 지도 및 내비게이션 서비스에서 두 지점 간의 경로를 안내하거나, 주변 장소를 검색하는 기능이 필요합니다. 오픈 소스 DBMS인 PostgreSQL과 이를 확장하여 공간 데이터를 처리할 수 있게 해주는 PostGIS는 공간 참조 시스템, 공간 데이터 타입, 공간 인덱스 등을 제공하여 복잡한 공간 데이터를 효율적으로 처리할 수 있도록 지원합니다. 이를 활용해 두 지점 간의 거리 계산, 주변 반경 검색, 경로 최적화 등 다양한 공간 연산을 수행할 수 있는데, 이 중 두 지점 간의 거리 계산에 대해 알아보도록 하겠습니다. PostgreSQL & PostGIS 설치하기 저는 Docker Compose 환경..

[Linux] 프로세스에게 시그널 보내기

들어가기 앞서 - 시그널(Signal)이란?시그널은 운영 체제가 프로세스 간 통신을 위해 사용하는 중요한 메커니즘 중 하나입니다. 시그널은 프로세스에게 특정 이벤트가 발생했음을 알리고, 프로세스가 그에 맞게 행동하도록 합니다.    SIGNAL의 특징비신뢰성리눅스 시그널은 비신뢰성을 가지고 있습니다. 이는 시그널이 도착하는 순서가 보장되지 않으며, 시그널이 손실될 수 있다는 것을 의미합니다. 여러 시그널이 동시에 발생하면 일부 시그널은 무시될 수 있습니다.  대기하지 않음시그널은 비동기적으로 처리됩니다. 이는 시그널이 발생하면 즉시 프로세스에 전달되며, 프로세스는 시그널을 기다리지 않고 자신의 작업을 계속 수행할 수 있습니다. 시그널이 도착했을 때만 프로세스는 이를 처리합니다.  대표적인 SIGNAL S..