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

Framework 25

[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

[Spring] 애플리케이션과 NCP Object Storage 연결하기

Spring 애플리케이션과 네이버 클라우드 플랫폼(NCP)의 Object Storage 간 연결을 구성하는 방법에 대해 알아보겠습니다. 💡Object Storage?데이터를 객체 단위로 저장하는 서비스로, AWS의 S3와 유사한 서비스입니다.  1. Object Storage 버킷 생성하기 NCP 콘솔에 로그인하셨다면, 왼쪽 메뉴 중 Services를 클릭 후, Object Storage를 클릭해주세요.    최초로 해당 서비스에 접근하는 경우, 이용 신청 및 약관 동의를 먼저 진행해야 합니다.동의 후, Bucket Management → 버킷 생성을 진행해 주세요.    다음으로, 생성할 버킷의 이름을 입력합니다.버킷의 이름은 리전 내에서 유일한 이름이여야 합니다!    이후, 설정 관리(잠금 여부 ..

Framework/Spring 2024.03.25

[Spring] 스프링의 캐시 추상화

들어가기 앞서 - 캐시(Cache)란? 캐시(Cache)는 데이터 빠르게 접근하기 위해 임시로 저장하는 공간 입니다. 캐시는 자주 사용되는 데이터나 결과를 저장해 두었다가, 동일한 요청이 들어올 때 빠르게 응답할 수 있게 도와줍니다. 이는 데이터베이스나 외부 시스템에 대한 접근 횟수를 줄여 시스템의 전체적인 성능을 향상시킬 수 있습니다. 스프링에서는 이러한 캐시의 사용과 관리를 쉽게 만들어주는 캐시 추상화를 제공합니다. 스프링의 캐시 추상화는 다양한 캐시 저장소를 지원하며, 개발자가 캐시 로직을 쉽게 구현하고 관리할 수 있도록 지원합니다. 💡캐시 추상화란? 캐시 추상화는 캐시 구현을 애플리케이션 로직으로부터 분리하여, 개발자가 캐시를 보다 쉽게 사용할 수 있도록 하는 개념입니다. 어노테이션을 사용하여 메..

Framework/Spring 2024.03.17

[Spring] SpEL으로 더 강력하게 표현식 작성하기

SpEL이란? Spring Expression Language(SpEL)은, 객체 그래프를 조회하고 조작하는 데 사용되는 표현식 언어입니다. SpEL을 사용해 런타임에 객체의 속성에 접근하거나, 메서드를 호출하거나, 배열, 리스트 및 맵과 같은 컬렉션에 대한 조작을 수행할 수 있습니다. 또한, 논리적 및 산술 연산을 수행하는 데도 사용할 수 있습니다. SpEL의 기본 문법 1. 리터럴 표현식 - 문자열, 숫자, boolean 등 ExpressionParser expressionParser = new SpelExpressionParser(); String helloWorld = (String) expressionParser.parseExpression("'Hello World'").getValue(); i..

Framework/Spring 2024.03.13

[Spring] 애플리케이션의 초기 응답 속도 개선하기

들어가기 앞서 - 왜 Spring에서 초기 요청의 응답이 지연될까? Spring으로 개발을 하다 보면, 애플리케이션을 실행하고 초기 요청, 특히 첫 요청의 응답이 유난히 오래 걸린다는 점을 알 수 있습니다. 이러한 현상을 'Cold Start'라고 부르는데, 'Cold Start'의 주요 원인으로 추정할 수 있는 상황은 아래와 같습니다. 1. JIT 컴파일러의 작동 방식 Java는 'Write Once, Run Anywhere'를 지향하는 플랫폼 독립적인 언어입니다. 그래서, 일반적인 컴파일 언어와 동작 방식에서 약간의 차이가 있는데, Java 프로그램은 컴파일 시점에 바이트 코드로 변환되었다가, 실행 시점에 기계어로 변환되어 실행됩니다. 이러한 방식은 프로그램의 이식성을 높이는 대신, 바이트 코드를 실..

Framework/Spring 2024.03.07

[Spring] Redisson으로 동시성 문제 해결하기

들어가기 앞서 - 동시성 문제란? 동시성 문제는 하나의 데이터에 여러 스레드가 동시에 접근할 때 발생할 수 있는 문제를 말합니다. 멀티스레딩 환경에서 특히 중요한 이슈로, 여러 스레드가 공유 자원에 동시에 액세스 할 때 정확성과 일관성에 문제가 생겨 데이터의 손상, 잘못된 실행 결과 등을 초래할 수 있습니다. 이를 방지하고, 공유 자원에 대한 안정적인 접근과 제어를 위해서는 한 번에 하나의 요청만을 처리할 수 있도록 하는 Lock이 필요합니다. 1. Synchronized 사용 다른 방법보다 비교적 간단하게, Java의 synchronized 키워드를 사용해 해당 메서드나, 코드 블럭을 동기화해 한 스레드에서 해당 자원에 접근 중이라면, 다른 스레드의 접근을 막아 해당 자원을 Thread-safe 하게 ..

Framework/Spring 2024.02.28

[Spring] 스프링의 계층형 아키텍처

프레젠테이션 계층 (Presentation Layer): 이 계층은 사용자의 요청을 받아 처리하고, 그 결과를 사용자에게 돌려주는 역할을 합니다. 컨트롤러(@Controller 또는 @RestController)가 이 계층을 구성합니다. RESTful API를 구성하는 데 필요한 매핑 어노테이션(@GetMapping, @PostMapping 등)을 제공합니다. 서비스 계층 (Service Layer): 비즈니스 로직(애플리케이션의 핵심 기능과 요구 사항)을 수행하는 계층입니다. @Service 어노테이션을 사용하여 이 계층의 컴포넌트를 명시합니다. 서비스 계층은 다양한 도메인 모델과 상호작용하며, 필요한 경우 트랜잭션 관리도 수행합니다. 데이터 접근 계층 (Data Access Layer): DB나 다른..

Framework/Spring 2024.02.19

[Spring] @Transactinal 파헤치기

들어가기 앞서 - 트랜잭션(Transaction)이란? 트랜잭션(Transaction)은 데이터베이스의 상태를 변화시키는 하나의 작업 단위를 의미합니다. 하나의 트랜잭션에 여러 작업(연산)이 포함될 수 있으며, 이 작업들은 모두 성공적으로 완료되거나, 하나라도 실패할 경우 전체가 취소(롤백)되어야 합니다(All or Nothing이라고도 합니다. 한국어로는 모 아니면 도?). 이러한 특성 때문에 트랜잭션은 데이터의 일관성과 무결성을 유지하는 데 핵심적인 역할을 합니다. '@Transactinal' 어노테이션 // try-catch를 통해 트랜잭션을 수동으로 관리하는 코드 public class Example { public static void main(String[] args) { Connection ..

Framework/Spring 2024.02.04