모르지 않다는 것은 아는것과 다르다.

전체 글 224

Spring AOP 4편 (With Spring Transaction)

개요 3편에서는 Spring 트랜잭션(@Transactional)의 동작과정을 알아보았다. 4편에서는 @Transactional 어노테이션 처리 과정을 도식화하여 정리하고, 디버깅해보도록 하자. 나는 보통 코드를 분석할때, 애플리케이션 로딩 시점과 런타임 시점을 구분해서 분석한다. 좀 더 자세히 말하면 아래와 같이 구분할 수 있다. 먼저 애플리케이션 로딩 시점과 런타임 시점으로 나눌 수 있고, 로딩 시점에는 자동구성을 하는 시점과 스프링 컨테이너가 세팅되는 시점으로 나누어 보았다. 자동구성에는 이번에 알아볼 Spirng AOP 관련된 자동구성과 Spring Transaction 관련된 자동구성에 대해서만 알아보도록 하겠다. 사실 이것보다 훨씬더 깊고 복잡하지만, 나는 우선 이정도로만 Spring AOP와..

Spring 2023.04.20

Spring AOP 3편 (With Spring 트랜잭션)

개요 2편에서는 Spring AOP의 적용방법에 대해서 알아보았다. 3편에서는 Spring AOP의 적용사례중 가장 많이 사용되는 스프링 트랜잭션(@Transactional)의 동작 방식을 알아보도록 하자. Spring 트랜잭션 프록시 동작 과정 이전편에서 프록시, 어드바이스, 포인트컷, 어드바이저 에 대해서 알아보았다. Spring 트랜잭션도 AOP 기반으로 동작하기 때문에 위 4가지 요소를 집고 넘어가야한다. 프록시 (in Spring 트랜잭션) @Transactional 애노테이션이 클래스나 메소드에 붙어있으면, 트랜잭션 AOP는 해당 클래스를 프록시로 만들어서 스프링컨테이너에 등록한다. 이전편에서 AnnotationAwareAspectJAutoProxyCreator라는 빈 후처리기가 포인트 컷을 ..

Spring 2023.04.20

Spring AOP 2편 (With Spring Transaction)

개요 1편에서 프록시, 어드바이스, 포인트컷, 어드바이저의 개념을 알아보았다. 이번 편에서는 이러한 4가지 요소를 활용하여 Spring AOP가 어떻게 적용되는지 살펴보도록 하자. Spring AOP 적용방법 위에서 프록시, Advice, Advisor, 포인트컷에 대한 개념을 정리해 보았다. Spring AOP 적용방법에 대해서 알아보자. 아래와 같이 4가지 방법으로 Spring AOP를 적용할 수 있다. (아래로 갈수록 좋다.) 프록시객체 직접 구현 빈 후처리기 사용 AnnotationAwareAspectJAutoProxyCreator 사용 @Aspect 사용 실무에서는 거의 4번 사용한다. 그렇기 때문에 AOP 동작과정을 모르고 넘어가는 경우가 많다. @Slf4j public class Sample..

Spring 2023.04.20

Spring AOP 1편 (With Spring Transaction)

개요 나는 Spring AOP를 사용해서 어려가지 기능을 구현했다. 하지만, Spring AOP의 정확한 동작원리에 대해서 알지는 못했다. 그래서 이번기회에 Spring AOP의 꽃이라고 불리는 Spring Transaction(@Transactional) 코드를 예시로 분석해보면서 Spring AOP 에 대해서 공부해 보려고 한다. Spring AOP Spring Transaction 코드를 보기전에 먼저, Spring AOP 에 대해서 개념을 정리해보자. 위의 그림을 보면, 프록시가 여러개의 어드바이저를 가지고 있고, 어드바이저는 1개의 포인트컷과 하나의 어드바이스를 가지고 있다. 또한, 프록시는 Target도 가지고 있으며, Target의 메소드 하나하나가 조인포인트가 될 수 있다. 포인트컷은 여러..

Spring 2023.04.20

쿼리연습 (겹치는 날짜 검사하기)

개요 새로운 데이터를 추가할 때, 날짜별로 겹치는 데이터가 있는지 밸리데이션 하는 경우가 종종 있다. 이상하게도 나는 날짜가 겹치는지 체크하는 로직을 생각할 때 헷갈리는 경우가 많아서 이번에 그림으로 정리하고 넘어가려고 한다. 테이블 create table employee ( employee_id bigint primary key, employee_name varchar(255) not null, begin_date varchar(8) not null, end_date varchar(8) not null ); 데이터 INSERT INTO employee (employee_id, employee_name, begin_date , end_date) VALUES (1, 'Alice', '20220101' , ..

Database 2023.04.07

2022년 회고록

개요 작년에 회고록을 작성한 지 벌써 1년이 지났다. 시간이 빨리 간 것 같지만, 1년이란 시간 동안 내가 느끼고 배운 것들을 생각해 보면 절대 짧지 않은 시간이었던 것 같다. 그래서 작년에 내가 겪었던 일들에 대해서 간단하게나마 정리해 보려고 한다. 회사 생활 우리 팀은 인사 솔루션 개발에 사용되는 프레임워크를 개발한다. 그렇기 때문에 우리 팀의 역할은 팀에서 만든 프레임워크를 사용하는 개발자들이 편하게 개발할 수 있도록 좋은 기능을 제공해 주는 것이다. 팀에서 하는 업무는 너무 마음에 들었다. 단순 반복 업무가 아닌, 그때그때 필요한 기능을 구현하고 내가 구현한 기능이 현재 운영 중인 서비스에 반영되었다. 물론, 신입 개발자에게는 어렵고 부담스러운 업무였던 것 같다. 하지만 좋은 선임 개발자분들이 많..

Diary 2023.03.09

SpringMVC를 이용해서 요청 Body값 Trim처리하기

개요 우리가 개발한 프레임워크를 사용하는 팀이 @RequestBody를 통해 전달되는 데이터에 대해 trim 처리를 요청했다. 이 기능을 구현하면서 예전에 공부한 SpringMVC의 코드를 복습할 수 있어 좋았다. 그래서, 제가 공부한 내용을 간단하게 정리하려고 합니다. SpringMVC의 요청 처리 흐름 Trim 처리를 위해 SpringMVC를 사용하려면 먼저 SpringMVC가 요청을 어떻게 처리하는지 이해해야 한다. 이해를 돕기 위해 아래의 클래스들을 살펴보자. 위의 그림과 같이, 먼저 DispatcherServlet이 요청을 받아서 doDispatch() 메소드에서 HandlerMapping을 하고, 그 결과에 따라서 HandlerAdapter를 찾는다. HandlerAdapter를 보면, sup..

Spring 2023.03.06

MongoDB Aggregation를 활용해서 QueryDSL-JPA 대체하기 #2

개요 1,2 편에서는 MongoDB Aggregation에 대해서 알아보고, Spring Data MongoDB가 제공해 주는 기능도 알아보았다. 나는 실무에서 실제로 QueryDsl-JPA로 구현된 로직을 Spring Data MongoDB로 변환하는 표준을 만들었다. 나의 목표는 MongoDB Aggregation 쿼리 문법를 알지 못하는 개발자도 QueryDsl로 짜인 모든 로직을 손쉽게 MongoDB Aggregation으로 바꿀 수 있는 방법을 제시하는 것이었다. 하지만, 2편에서 소개했듯이 MongoDB Aggregation으로 코드를 짜면, 코드가 너무 길어지고, 복잡했다. 나는 위의 문제를 해결하기 위해서 AggregationBuiler 클래스를 구현했고, 모든 QueryDsl 로직을 Mo..

MongoDB 2023.02.10

MongoDB Aggregation를 활용해서 QueryDSL-JPA 대체하기 #1

개요 사내에 우리가 만든 프레임워크에 대한 관심이 높아지면서, 몇몇 팀으로부터 프레임워크 적용 요청이 증가하고 있다. 소규모 솔루션의 경우에 RDBMS를 사용하지 않고 MongoDB만을 사용하는 팀들에서도 적용 가능한지에 대한 기술검토를 요구해 왔다. (작은 규모의 솔루션이라 RDB까지 구축하기 힘든 경우가 있다고 한다.) 그래서 기존 RDB로 짜인 로직을 어떻게 하면 MongoDB로 전환할 수 있을지를 고민하던 중 MongoDB Aggregation이라는 것을 알게 되었고, 이를 Spring Data MongoDB를 사용해서 구현할 수 있다는 사실도 알게 되었다. 결론적으로는 성공적으로 전환할 수 있었고, 그 과정을 정리해 보려고 한다. MongoDB는 도큐먼트 기반의 NoSQL인데 RDBMS의 쿼리를..

MongoDB 2023.02.10

AbstractRoutingDataSource를 통한 Multi-DataSource 구현

개요 사용자 로그인 정보에 따라 다른 DB를 참조하고자 하는 요구사항이 있었다. 지금까지는 yml에 설정된 DataSource 정보가 빈으로 등록되는, 즉 정적인 방식으로 DataSource를 빈으로 주입하였다. 조사를 진행하던 중, AbstractRoutingDataSource를 사용하여 동적으로 DataSource를 결정하는 방법이 있다는 것을 알게 되었다. 구현 내용을 정리하기 앞서 먼저 DataSource가 어떤 것인지 간단히 정리해보자. DataSource DataSource의 역할은 간단하다. 바로 Connection을 관리해 주는 빈이다. 보통은 아래와 같이 yml에 datasource 정보를 입력하면, Spring Boot가 자동으로 DataSource를 빈으로 등록해 준다. 참고로 Spr..

Spring 2023.02.04