사이드 프로젝트에서 Domain Entity 와 JPA Entity 를 분리해 개발하고 있고, 두 객체를 쉽게 매핑하기 위해 mapstruct 를 사용하고 있다. 지금까지는 단순히 mapstruct 가 만들어주는 매핑 메소드를 사용만 해왔는데, 최근 마주한 이슈를 토대로 mapstruct 가 매핑 메소드를 어떻게 만들어나가는지에 대해 소개해보려한다. 어...
들어가기 전에 앞서 IoC & DI(Inversion of Control & Dependency Injection) 에 대한 오해를 조금 풀어보려고한다. 우리는 Spring Boot 를 처음 공부하면서 자연스럽게 Spring 의 3대 특징 중 하나인 IoC & DI 에 대해서 공부한다. 그래서 자연스럽게 IoC & DI 가 Spring 에서 제공해주는 특...
Spring Security 는 Spring 으로 개발하는 어플리케이션 위에서 인증/인가를 구현하는데 도움을 주는 프레임워크다. 하지만 Spring Security 에 너무 의존적인 프로그래밍을 하거나 Spring Security 라는 프레임워크를 제대로 이해하지 못하고 사용하는 사례들을 너무 많이 접해 관련해서 내 생각을 정리해보려한다. 지극히 개인적...
사건의 발단 현재 회사에서 Spring Batch 를 이용해 다양한 배치 어플리케이션을 개발하고 있다. 그 과정에서 Step Flow 가 내가 예상했던대로 흘러가지 않는 이슈가 발생했는데, 해당 포스팅에서는 그 이슈에 대해서 소개하려한다. > 여기서 Step Flow 란 여러 Step 들을 순차적으로 처리하거나, 분기 처리하는 등의 흐름을 만드는 것을 ...
흔히 Spring 위에서 Spring Data JPA 를 이용해 개발하다보면 아래와 같은 구조로 Service 가 Repository 를 의존하는 코드를 작성하곤 한다. 위와 같은 구조는 매우 흔하게 볼 수 있는 구조고 나도 처음 개발할 당시에 아무 생각없이 이런 구조를 사용하곤 했다. 하지만 위 구조에는 약간의 문제가 있다. 위 구조를 절대 사용하면...
이번 포스팅은 앞서 작성했던 EhCache Self-Invocation 문제 (Feat. nGrinder) 에서 이어지는 내용이다. 이전 포스팅에서 Spring AOP 에서 발생할 수 있는 내부호출문제(Self-Invocation) 에 대해서 소개했다. 내부호출문제에 대한 해결방법으로 아래 세 가지를 소개하긴 했지만, 개인적으로 모두 와닿지 않는 방법들이...
저번 포스팅에서 우리는 타입계층에 대해서 이해했고, 타입계층을 이용해 다형성을 구현하는 방법까지 살펴봤다. > https://velog.io/@slolee/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5%EC%97%90%EC%84%9C-%ED%83%80%EC%9E%85%EA%B3%84%EC%B8%B5%EC%9D%B4-%EC%A4%91%EC...
회사에서 캐시 구조에 대해서 리팩토링을 진행하는 과정에서 EhCache Self-Invocation 문제로 인해 캐시가 정상적으로 동작하지 않았던 사례에 대해서 포스팅하려고 한다. 어떤 문제가 있었는지 예제를 통해서 간단하게 살펴보자. EhCache 는 그냥 로컬 캐시 라이브러리라고 생각하면 될 것 같다. @Cacheable 어노테이션을 붙이면 해당 메...
블로그에서 처음으로 객체지향에 대해서 이야기해보려고 한다. 그동안 객체지향에 대해서 포스팅을 쓰지 않았던 이유는 내가 함부로 다룰 수 없는 주제라고 생각했기 때문이었다. 오늘 인프콘 2023 에 참여했는데 거기서 "과거의 흔적을 보고 이불킥 한다는건 내가 그만큼 성장했다는 증거다" 라는 말을 들었고, 완벽하지 못할지도 모르는 객체지향 관련 포스팅을 작성해...
우리 팀 프로젝트에서는 JPA 와 QueryDSL 을 조합해서 사용하고 있다. 해당 프로젝트에서 JPA 를 통해 Batch Insert 하는 과정에서 겪었던 문제를 소개하고, 어떻게 해결했으며 그 결과로 어느정도의 성능향상이 이뤄졌는지 소개하려고 한다. Batch Insert 란? 간단히 설명하면 여러 개의 Row 를 한 번의 쿼리로 Insert 하는...
들어가기에 앞서.. 회사 프로젝트에서 API Request Header 에 포함되어 들어온 사용자정보를 Interceptor 에서 검증하고, 이를 UserContext 에 담아 전역적으로 사용하기 위한 구성을 했고, 이를 구현하는데 ThreadLocal 를 사용했다. Request Per Thread 방식으로 동작하는 Tomcat 기반의 서버였기 때문에...
본격적인 이슈를 소개하기에 앞서 기능하나를 소개하려고 한다. > 사용자 스토리 : 사용자는 관심있는 주식을 관심항목으로 등록할 수 있다. 간단한 기능이다. 이를 구현하기 위해 서버에서는 interest_asset 테이블을 설계했다. account_id 가 설정한 관심자산 목록은 콤마(,) 로 이어져서 데이터베이스에 저장한다. 예를들면 A 사용자가 5...
사실 @Transactional 은 Spring Boot 로 진행한 첫 프로젝트부터 지금까지 정말 많이 써온 어노테이션이다. 지금까지 사용하면서 이해하고 있었던 바를 먼저 정리해보면 아래와 같다. DB 에 접근하는 서비스 로직에 Transaction 을 적용하고 싶을 때 사용한다. AOP 를 이용한 선언적 트랜잭션 방식이다. Aspect 에서 Platfo...
분산락을 고려해야하는 상황은 무엇일까? ** Scale-out 을 통해 서버를 여러대로 확장한 상황에서 하나의 데이터에 대한 동시성 문제를 해결**하기 위해 사용한다. 내가 동시성 문제를 겪은 상황은 API 서버를 여러 대로 Scale-out 한 환경에서 1개의 DB 서버를 공유하는 상황이었다. 부하분산을 위해 Scale-out 이 기본이되는 요즘 환경...
JPA 에서 가장 중요한 개념이라고 하면 연관관계 매핑과 영속성 컨텍스트가 있다. 이번 포스팅에서는 이 중에서 연관관계 매핑에 대해서 이야기해보려고 한다. ** 객체지향 프로그램에서의 객체와 RDB 에서의 테이블이 서로 연관관계를 맺는 방법이 다르다.** 그렇기 때문에 이 둘의 차이를 채우기 위한 매핑과정이 필요하고 이를 ORM 인 JPA 가 수행하게 된...