[ Spring Boot ] Spring MockMvc 테스트 유지보수 후기
·
Spring/기초 개념
1. 테스트 코드도 유지보수를 해야할까?1-1. 배경현재 진행하고 있는 프로젝트에서는 개발된 API에 대해서 Spring MockMvc를 활용한 컨트롤러 테스트를 작성하여 전체 기능을 검증하는 방식으로 테스트를 진행한다. 이러한 상황에서, 테스트 코드를 작성하는 것은 각 유즈 케이스에서 발생할 수 있는 문제를 사전에 확인하고, 개발된 기능이 의도에 맞게 작동하는지 확인하며, 기능에 대한 명세로서 동작할 수 있다. 기존에는 테스트 코드를 작성할 때, 유지보수나 추후 변경에 대한 고려는 크게 하지 않았다. 기능이 바뀌었을 때 테스트 코드가 변경되는 것은 당연한 것이라고 때문이다. 하지만 테스트 코드 작성의 편의성과 테스트 대상 외 변경사항으로 인한 영향을 최소화하기 위해 테스트 코드 리팩토링을 진행하게 되었..
[ Spring ] Spring JPA N+1 문제 해결하기
·
Spring/JPA
1. JPA N+1 문제1-1. JPA N+1 문제 개념우선 아래 코드는 전형적인 N+1 문제가 발생하는 코드이다.어떤 부분에서 발생하는지 살펴보자// user entity class@Entitypublic class User{ ... @OneToMany(mappedBy="user") private List posts;}// post entity class@Entitypublic class Posts{ .... @Column private String title; .... @ManyToOne private User user;}// user repository@Repositorypublic Interface UserRepository extends JpaRe..
[ Spring Boot ] JPA 연관 관계 매핑
·
Spring
1. 학습 목표최근 복잡한 테이블 구조를 갖고 있는 사이드 프로젝트를 진행하고 있다.하지만 JPA 관련 지식이 부족하다보니 Entity 간 관계를 다루는데 어려움을 겪고 있다. 따라서 이번에는 JPA의 연관 관계 매핑에 대해서 학습하여 현재 부족한 부분에 대해서 채워볼 예정이다. 2. 단방향 연관관계 (단방향 매핑)단방향 연관관계는 참조용 필드를 통해 한 방향으로만 객체 참조가 이루어지는 연관 관계이다.따라서 엔티티 간 한 방향만 사용하여 참조가 이루어지는 경우 해당 매핑 방식을 사용하면 된다.2-1. 단방향 다대일 관계단방향 다대일 관계는 Entity 간 부모 / 자식 관계를 나타내기 위해서 사용하는 일반적인 연관 관계이다.Entity에서 자식 Entity에 @ManyToOne 어노테이션을 갖는 필드..
[ Spring Boot ] 스트리밍 서비스에서 Buffer Pool로 ByteBuffer 관리
·
Spring
현재 프로젝트의 문제점현재 실시간 스트리밍 프로젝트를 하던 중 메모리 관리가 잘 되지 않는다는 문제가 있었다. 메모리가 일정 이상으로 증가하면 GC가 메모리를 정리해주지만 보다 효율적인 코드를 짜보려고 했다.현재 코드 분석우선 현재 코드는 아래와 같이 동작한다.프레임 생성자 스레드에서 ByteArrayOutputStream에 바이트 단위로 값을 넣어서 jpeg 프레임 이미지 생성프레임을 byte[]에 복사 후 프레임 소비자 스레드로 전달프레임 소비자 스레드는 데이터를 받아서 클라이언트에 전달코드 문제점 분석하지만 이 코드에는 몇 가지 문제가 있다.ByteArrayOutputStream은 byte를 추가할 때 공간이 부족하면 새로운 배열을 만들고 값을 복사함ByteArrayOutputStream을 byte..
[ Spring Boot ] 웹소켓 통신에서 메모리 누수 제어
·
Spring
웹소켓 통신에서의 메모리 누수현재 stomp 기반의 실시간 영상 스트리밍 기술을 개발하고 있다.하지만 화면 새로고침이나 화면 이동 등의 상황에서 서버의 메모리가 급격하게 늘어나는 것을 확인했다. 이 부분을 해결하기 위해서 다음과 같은 방안들을 사용했다. 효과적인 소켓 연결 관리 방법Stomp에서의 메모리 누수를 막기 위해서 서버에서만 동작이 필요한 것이 아니다.프론트엔드와 백엔드 모두 적절한 처리를 해주어야 작업이 완료될 수 있다.React에서 효과적으로 소켓 연결 관리하기React에서 서버의 메모리 누수를 발생시키는 원인은 주로 불필요한 연결 유지나 중복 연결로 인해서다.이를 위해서 적절한 시점에 적절한 방법으로 연결 및 연결 해제해야 한다연결 해제 로직 관리하기우선 이번 프로젝트에서는 다음과 같이 연..
[ Spring ] Spring의 디자인 패턴과 아키텍처
·
Spring
디자인 패턴과 아키텍처소프트웨어 아키텍처정의소프트웨어 시스템의 기본 구조와 시스템을 만드는 분야소프트웨어의 뼈대나 고수준의 기반을 담당함소프트웨어 아키텍처 패턴 예시MVC 패턴layered 패턴event-bus 패턴p2p 패턴interpreter 패턴pipe-filter 패턴소프트웨어 디자인 패턴주어진 상황에서 일반적으로 발생하는 문제에 대한 재사용 가능한 솔루션여러 상황에서 사용할 수 있는 문제 해결법이나 템플릿을 의미함소프트웨어 디자인 패턴의 예시싱글톤 패턴팩토리 메서드 패턴추상 팩토리 Spring의 아키텍처 패턴 : MVCservletJava 웹서버에서 동적 컨텐츠를 제공하는 기술특정 HTTP 메서드를 처리 가능서블릿을 관리하는 서블릿 컨테이너 (톰캣, 제티 등)이 존재특정 URL을 매핑하여 처리..
[Spring Boot] MSA에서 git action과 docker를 활용한 Docker CI/CD 구축
·
Spring/기초 개념
Docker CI/CD의 필요성기존 프로젝트에서는 각 마이크로서비스를 도커 이미지로 관리하고 있었다하지만, 각 서비스를 이미지화할 때 이 작업을 수작업으로 해야하는 문제점이 있었고 이는 번거로움으로 이어졌다. 따라서 이번 프로젝트에서는 master 브랜치에 작업 내용을 push했을 때, 이미지가 자동으로 Docker hub로 업로드되도록 CI/CD를 구축해볼 예정이다.CI/CD의 기초 개념그렇다면 CI/CD가 도대체 무엇일까?CI/CD를 구축하기 위해서 이 부분에 대해서 정확하게 알고 넘어갈 필요가 있다.CI 기본 개념CI는 지속적 통합의 약자로, 코드 변경 사항을 공유 분기(브랜치)로 빈번하게 병합하는 것을 용이하게 하는 프로세스이다.CI는 코드 변경 사항을 테스트, 빌드 등을 자동으로 하는 것을 의미..
[Spring Boot] Spring MVC + WebClient 환경에서 JPA 사용하기
·
Spring/기초 개념
굳이 JPA를 사용하려고 하는 이유사실 가장 편한 방법은 JPA가 아닌 R2DBC와 같은 반응형 드라이버를 제공하는 DB를 선택하는 것이 합리적이다. 하지만, 여기서 굳이 JPA를 사용하려는 이유가 있다.R2DBC와 Spring MVC는 동작 방식이 다르므로 함께 사용하는 것을 피해야 한다. R2DBC : 비동기/논블로킹 기반 기술Spring MVC : 서블릿 기반의 블로킹 웹 프레임워크즉, MVC에서 R2DBC의 결과를 바로 받아서 사용하기 어렵고, block을 걸거나 리액티브 체인을 만들어야 한다block은 전체적인 애플리케이션의 성능을 떨어뜨리기 때문에 지양해야 한다.현재 프로젝트에서 WebClient는 현재 마이크로 서비스 간 통신과 외부 API 호출에만 사용된다.따라서 통신을 위해 프로젝트 Sp..
[Spring Boot] Spring AOP Self Invocation과 @Transactional
·
Spring/기초 개념
발생한 문제우선 아래 코드에서는 트랜잭션이 정상적으로 작동하지 않는다.public class UserService { @Autowired private UserRepository userRepository; /* 사용자 토큰 저장 재귀 호출*/ public void saveUserInfo(UserDto userDto){ saveUserToken(userDto.getEmail()); } /* 토큰 저장 */ @Transactional public void saveUserToken(String email){ String token = email + "_token"; userRepository.saveToken(email, tok..
Spring Data JPA의 영속성 컨텍스트
·
Spring/기초 개념
JPA로 개발하며 느낀 한계기존에 JPA를 활용하여 개발하면서 영속성 컨텍스트와 EntityManager에 대해서 알고는 있었다.하지만, 솔직히 자세히 알지는 못했기에 확신을 갖고 개발하지는 못했던 것 같다. 따라서 이번에는 영속성 컨텍스트에 대해서 알아보고, 이 영속성 컨텍스트의 역할에 대해서 알아볼 예정이다. 영속성 컨텍스트영속성 컨텍스트 개념 + 간단한 EntityManger 개념영속성 컨텍스트는 엔티티를 관리하는 1차 캐시이다. 영속성 컨텍스트는 특정 저장소에서 관리하는 엔티티들의 집합을 의미하고 엔티티의 생성, 영속화, 제거 범위를 결정한다.따라서 DB에서 가져온 엔티티를 보관하고, 변경 사항을 추적하는 역할을 수행한다. EntityManager는 이러한 영속성 컨텍스트와 통신하고 엔티티 상태를..