본문 바로가기

Spring14

[Redis] Redis Cache를 활용한 성능 개선기 (1) 0. 이 글을 쓰게 된 이유 프로젝트에 캐싱을 통해서 성능 개선을 하면서 Redis를 사용한 경험을 기록하고자 이 글을 쓰게 되었다. 1. 캐싱에 레디스를 선택한 이유 1. 높은 성능 Redis는 기본적으로 전체 데이터를 메모리에서 관리한다. 데이터 백업 같은 작업은 디스크에 저장하긴 하지만 이는 비동기로 작동하기 때문에 응답 성능에는 거의 영향을 미치지 않는다. 그에 반해 RDB는 기본적으로 데이터를 디스크에서 관리한다. 요즘 RDB들도 메모리를 많이 활용하긴 하지만 결국에는 디스크에 저장된다. 즉, Redis는 RDB와 다르게 Disk I/O가 자주 발생하지 않기 때문에 성능이 몇 배 빠를 수 밖에 없다. 2. 개발 용이성 어플리케이션과 연동하기 쉽게 여러 개발 언어를 지원한다. 그리고 다른 NoSQ.. 2023. 11. 9.
[Spring] Event로 느슨한 결합 찍먹하기 0. 이 글을 쓰게 된 이유 이번 프로젝트를 진행하며 Event를 활용하여 요구사항을 해결한 적이 있다. 그 과정을 기록하고자 이 글을 쓰게 되었다. 1. 쉽지 않은 요구사항 로드맵을 생성하는 로직이 있다. 이 로드맵은 각 단계가 있고, 각 단계에 사진 파일이 여러개 저장될 수 있다. 이 로직은 간단해보이지만 다음과 같은 문제점이 있다. 1. I/O가 실패하여 사진이 없어도 로드맵 생성 자체는 되어야한다라는 요구사항이 있다. 2. I/O중 예외가 발생하면 로드맵 생성 자체가 롤백된다. 3. 각 사진 파일은 I/O가 발생한다. 한 요청에 파일 I/O가 10번이상 발생할 수 있으니 트랜잭션이 굉장히 길게 걸린다. 4. 파일 I/O 후 경로와 같은 메타 데이터를 DB에 저장해야한다. 즉, 파일 I/O하는 서브.. 2023. 8. 29.
[Spring] 커스텀한 multipart/form-data 요청 받기 0. 이 글을 쓰게 된 이유 프로젝트를 진행하며 쉽지 않은 요구사항을 기술적으로 해결한 사례에 대해서 기록하고자 이 글을 쓰게 되었다. 1. 쉽지 않은 요구사항 로드맵을 생성하는 API를 만들어야하는데 다음과 같은 특이한 요구사항이 있다. 요구사항을 정리하면 다음과 같다. 1. 로드맵은 여러개의 단계를 가질 수 있다. 단계의 수는 가변적이다. 2. 각 단계는 0~2개의 사진 파일을 가질 수 있다. 즉, 사진의 수도 가변적이다. 3. 로드맵 생성에 필요한 다른 데이터는 json 형식으로 넘어온다. 4. 위 요구사항을 하나의 API로 해결해야한다. 2. 고려한 방법들 다음과 같은 방법들을 고려했었다. 2.1 API 분리 처음에는 이 정도로 큰 요청은 분리를 하는게 맞다고 생각했다. 애초에 API 설계가 잘못.. 2023. 8. 29.
[JPA] 영속성 전이와 고아 객체 0. 이 글을 쓰게 된 이유 프로젝트에 앞서 JPA 복습을 하면서 영속성 전이와 고아 객체 부분이 명확하지 않다는 느낌이 들어 정리를 하게 되었다. 1. 영속성 전이(CASCADE) 다음과 같은 엔티티 연관 관계가 있다고 가정하자 @Entity @Getter @Setter public class Parent { @Id private Long id; @OneToMany(mappedBy = "parent") private List children = new ArrayList(); } ======================================================== @Entity @Getter @Setter public class Child { @Id private Long id; @Man.. 2023. 6. 29.
[Spring] RequestBodyAdvice로 @RequestBody 커스텀하기 1. RequestBodyAdvice란? @RequestBody가 붙은 파라미터 객체를 커스텀하고 싶다고 가정하자. 우리는 자연스럽게 ArgumentResolver를 통해 커스텀 하려고 할 것이다. 하지만 ArgumentResolver는 1개의 파라미터 객체에 1개의 ArgumentResolver만을 허락한다. 우선 순위를 커스텀하지 않는 이상 @RequestBody가 우선순위를 갖고, 우리가 설정한 ArgumentResolver는 동작하지 않을 것이다. 그렇다면 @RequestBody를 커스텀할 방법은 없을까? 당연히 아니다. 이미 스프링은 이런 요구를 반영해서 RequestBodyAdvice를 만들어놨다. RequestBodyAdvice는 RequestBody를 커스텀 할 수 있는 기능을 제공한다. .. 2023. 5. 8.
[Spring] ViewResolver 코드 파보기 0. 이 글을 쓰게 된 이유 최근 Dispatcher Servlet에 대해 공부하면서 ViewResolver에 대해서 궁금증이 생겨 이 글을 쓰게 되었다. 1. ViewResolver란? ViewResolver는 요청이 들어오면 DispatcherServlet이 핸들러를 찾아서 해당 핸들러가 ModelAndView 객체를 반환한다. DispatcherServlet은 ViewResolver를 List로 가지고있는데, ModelAndView에 있는 View의 name을 활용해서 적절한 View를 찾아서 반환한다. 즉, ViewResolver는 적절한 View를 찾는 역할을 한다. 2. ViewResolver 동작 원리 2.1 ModelAndView 객체 찾아와서 실행한다. protected void doDi.. 2023. 5. 4.