Spring 5

Spring Transaction 에 대한 이해

📌 들어가며 코드리뷰를 진행하다 보면 항상 나오는 얘기 중 하나가 바로 '트랜잭션 관리를 어떻게 할것인가' 에 대한 내용입니다. 그만큼 Exception이 발생했을 때 어떻게 할 것인가에 대한 내용이 중요한 만큼 이에 대한 대처 중 하나인 Transaction에 대해 정리해 보도록 하겠습니다. 📌 Transaction 의 정의 트랜잭션은 데이터베이스의 상태를 변경하는 작업 또는 한번에 수행되어야 하는 연산들을 뜻합니다. 즉, 병행 제어 시 처리되는 작업의 논리적 단위입니다. Transaction은 하나의 흐름으로 하나의 실행이 성공하거나 실패하면 모든 연산들을 동일하게 처리합니다. A, B, C의 연산을 한 묶음이라고 할 때 A는 정상 작동 됐지만, B가 실패한다면 A의 작업 이력도 이전으로 돌립니다. ..

BackEnd/SpringBoot 2023.09.20

스프링 부트 로컬 캐시 적용하기

📌 들어가며 백엔드 개발을 할 때 가장 신경쓰게 되는 것은 아무래도 API의 성능일 것입니다. 많은 트래픽을 받아도 안정적인 속도로 동일한 결과를 사용자에게 제공해 주어야 하기 때문입니다. 이번 포스팅에서는 이러한 API의 성능을 높일 때 사용되는 방법중 하나인 캐시를 적용하는 방법을 알아보고자 합니다. 캐시를 적용하기 위해 Redis를 사용하기도 하는데요 해당 포스팅에서는 스프링부트의 자체 캐시(로컬 캐시)를 사용해 보도록 하겠습니다. 📌 캐시란? 캐시는 자주 사용하는 데이터를 저장해두고 재활용하는 기술을 뜻합니다. 일반적으로 캐시는 일시적인 특징이 있는 데이터 집합을 고속 데이터 스토리지 저장합니다. 따라서 이후에 해당 데이터에 대한 동일한 요청이 있을 경우, 데이터의 원본 스토리지 위치로 액세스할 ..

BackEnd/SpringBoot 2023.06.25

백엔드 아키텍처 개요(2) - DIP

지난 글에서 가장 기본적인 계층 구조의 아키텍처 구성에 대해 알아보았습니다. 이번 글에서는 그러한 계층 구조 아키텍처를 사용했을 때의 문제점과 이를 해결하기 위한 DIP(Dependency Inversion Principle) 의존성 역전 원칙을 알아보도록 하겠습니다. 예를 들어 어떠한 도메인의 가격 계산 규칙 기능이 있습니다. 할인 금액 계산 로직이 복잡해지게 되면 객체 지향으로 로직을 구현하는 것보다 룰 엔진을 사용하는 것이 더 알맞을 때가 있습니다. 다음의 예시 코드는 Drools라는 룰 엔진을 사용해서 로직을 수행하는 인프라스트럭처 영역의 코드입니다. public class DroolsRulerEngine { private KieContainer kContainer; public DroolsRul..

Architecture 2023.01.22

String 형태가 아닌 LocalDateTime그대로 받아보자!

Spring을 사용하여 개발 할 경우 Controller에서 요청 과 응답을 주고 받을 때 DTO에서 LocalDate와 LocalDateTime을 사용할 경우가 종종 있습니다. 이때 직렬화를 하지 못해 String으로 받은 후 서비스 레이어에서 혹은 DB에 저장하기 직전에 변환하는 경우가 있습니다. Spring에선 굳이 이럴 필요가 없으니 아래 내용을 토대로 번거로운 과정을 생략해보면 좋을 것 같습니다. 우선적으로 정답을 말씀드리면 @JsonFormat 어노테이션과 @DateTimeForamt을 사용하면 가능합니다. 1. RequestParameter 1-1. @ModelAttribute Controller 코드 @GetMapping("/get") public String get(GetModel get..

BackEnd/SpringBoot 2023.01.01

[JPA] 영속성 연관관계 전이 CASCADE 란?

JPA를 공부하면서 항상 헷갈렸던 부분이라 명확하게 정리를 해보고 넘어가려 합니다. CASCADE - 영속성 연관관계의 전이를 의미합니다. - 부모 엔티티에서 자식 엔티티로 상태를 전이하는 것입니다. ex. 부모 엔티티 저장할 때 자식 엔티티도 함께 저장, 게시글과 첨부파일 - Parent와 Child가 라이프사이클이 동일할 때, Child를 소유하는 Parent가 하나일 때 사용하는 것이 좋습니다. Entity의 상태 Transient : JPA가 모르는 상태 (단순 객체 생성) Persistent : JPA가 관리중인 상태 (1차 캐시, Dirty Checking, Write Behind, ...) Detached : JPA가 더이상 관리하지 않는 상태 Removed : JPA가 관리하긴 하지만 삭제..

BackEnd/JPA 2022.11.13