[LOATODO] 스프링 개발자의 NestJS 찍먹 후기
·
Project/LOATODO
1. 나름 안정적인 운영개발을 하다보면, 익숙한 환경을 벗어나 새로운 환경을 시도해보고 싶을 때가 있습니다. 백엔드 개발자가 갑자기 프론트엔드를 한다던가... 앱 개발을 한다던가.... 국비지원 자바로 시작해서 스프링으로 넘어가고,로아투두도 그렇고 현재는 주로 스프링 부트를 사용해 백엔드 개발을 해오고 있습니다. 최근에 느낀점은새로운 프로젝트를 시작해도, 이미 만들어진 틀이 있어spring starter에서 Security, JPA, QueryDSL 등 필요한 라이브러리 가져오고대충 config 파일 만들어서 세팅해주고 도커 파일 만들고 AWS에서 설정 해주면 CI/CD 들어가서 배포까지 깔끔하게 됩니다. 이렇게 하면 t4g.micro EC2를 예약 인스턴스를 구매했다는 가정하에하루에 2달러 내외의 서버..
[CS] 오픈소스 메시지 브로커 RabbitMQ
·
Computer Science
1. 등장 배경오늘날 IT 시스템은 점점 더 분산화되고 복잡해지고 있습니다.소위 MSA라는 단일 애플리케이션이 아닌 여러 개의 독립적인 서비스로 구성되는 마이크로서비스 아키텍처가 널리 사용되고 있죠.이러한 분산 시스템 환경에서는 서비스 간의 통신과 데이터 교환이 매우 중요해졌습니다. 예를 들어, 전자상거래 웹사이트를 생각해봅시다.주문 처리 시스템, 재고 관리 시스템, 배송 시스템, 결제 시스템 등 여러 개의 독립적인 서비스로 구성되어 있습니다.이러한 서비스들은 서로 연계되어 작동해야 하며, 데이터와 이벤트를 효율적으로 전달하고 조율해야 합니다. 과거에는 서비스 간 통신을 위해 직접 연결(Point-to-Point) 방식을 사용했습니다. 예를 들어, 주문 처리 시스템이 직접 재고 관리 시스템과 연결을 맺고..
[Spring / JPA] Server-Sent-Events(SSE)와 OSIV
·
Framework & Library/Spring
1. 서론 요즘 대부분 Spring Boot JPA를 많이 사용하고 추가로 SseEmiters로 실시간 알림기능 구현을 하려고 하면 대다수 IOException : Broken Pipe, Connection is not available, request timed out after 30004ms 이런 에러가 발생할 것입니다. 원인은 JPA의 영속성 컨텍스트, OSIV가 true로 설정되서 생기는 문제입니다. 이 글에서는 OSIV가 뭔지 정확히 왜 이런 에러가 생기는 건지 알아보고자 합니다. 2. 프록시 객체와 지연로딩 2 - 1. 프록시란? 프록시는 실제 클래스를 상속 받아서 만들어진 가짜 객체라고 할 수 있습니다. 이러한 프록시 객체는 실제 객채의 참조를 보관하는 특징을 가지고 있어 프록시 객체를 통해..
[LOATODO] 이메일 인증 추가후 구글 로그인 error
·
Project/LOATODO
1. 서론현재 LoaTodo는 구글 로그인으로만 가입이 가능한 상태인데 추가로 일반적인 회원가입과 로그인도 추가하려고 한다.(사실 원래 있었다가 굳이 있어야하나 싶어서 뺐었다...) 간단한 로그인 / 회원가입 코드와 JWT 관련 로직은 있어서 추가로 이메일 인증 정도만 넣으면 되는데여기에 Redis를 추가해보려고 한다. 당장으로는 이메일 인증 유효시간에 쓰고 추후 코드 리팩토링할 때 서버 최적화를 위해 사용할 예정이다.  [Spring] Spring Boot Redis 사용하기 / 이메일 인증 유효시간Redis는 key-value 구조로 데이터를 저장하는 In-memory 기반의 데이터베이스 시스템입니다. Spring boot 에선 어떻게 구현하는지 알아봅시다. 1. 먼저 Redis란? 먼저 Redis가..
[Spring] Spring Boot Redis 사용하기 / 이메일 인증 유효시간
·
Framework & Library/Spring
Redis는 key-value 구조로 데이터를 저장하는 In-memory 기반의 데이터베이스 시스템입니다. Spring boot 에선 어떻게 구현하는지 알아봅시다. 1. 먼저 Redis란? 먼저 Redis가 어떤건지는 블로그 다른 게시글에 작성해놨습니다. [CS / DataBase] 인메모리 데이터 저장소 Redis, 왜 사용할까? 개발을 하면서 트랜잭션의 속도를 어떻게 하면 줄일 수 있을까? 고민하면서 찾아보면 Redis라는 시스템을 접하게 된다. 그럼 이 Redis는 무엇일까? 1. 레디스(Redis) 란? Redis의 풀네임에서 할 수 있듯 repeater2487.tistory.com 2. Spring Boot에서 Redis 사용하기 2 - 1. 기본 설정 [ 의존성추가 ] 저는 대게 gradle를..
[LOATODO] 코드 리팩토링 SELECT 리팩토링
·
Project/LOATODO
1. 서론연관관계 테이블이 늘어나면서캐릭터 데이터를 호출할 때 SQL문이 여러번 실행된다. 1 - 1. 기존코드@Query(value = "SELECT c FROM Character c WHERE c.member = :member AND c.serverName = :serverName")List findCharacterListServerName(@Param("member") Member member, @Param("serverName") String serverName); JPA로 Member Entity를 불러와서 Controller에서 DTO로 변경할 때필요한 데이터들을 LAZY 형식으로 불러온다. 1 - 2. 기존코드 결과2023-11-24 17:32:29.777 DEBUG 39633 --- [ni..
[LOATODO] JPA 영속성 컨텍스트 더티체킹 VS JPQL로 벌크업데이트
·
Project/LOATODO
1. 서론프로젝트에서 JPA를 사용하여 CRUD 중 Update를 구현할 때,보통 변경감지(Dirty Checking)를 이용합니다.Entity를 조회하여 조회된 Entity 데이터를 변경만 하면 데이터 베이스에 자동으로 반영이 되도록 하는 기능입니다. 1 - 1. 영속성 컨텍스트JPA에서는 Entity Manager를 통해 데이터 베이스 작업을 처리합니다.Entity Manager는 내부적으로 영속성 컨텍스트라는 메모리 영역을 가지며 이 안에 데이터베이스로부터 조회한 Entity 객체들이 저장되어 있습니다. 1 - 2. 영속성 컨텍스트 변경감지(더티 체킹) JPA는 트랜잭션 되는 순간 내부적으로 flush()가 호출됩니다.그때 엔티티와 1차 캐시 내의 스냅샷(최초 상태)을 비교합니다.비교했을 때, 변경..
[LOATODO] 주간 숙제 완료 시 수치가 초과되는 에러
·
Project/LOATODO
1. 서론주간 숙제 완료(체크)시 수치가 초과되는 에러가 있다  오른쪽 상단 주간 수익 107.4%...2. 개발2 - 1. 백엔드 원인골드 획득 리스트랑 상관없이, 캐릭터에 저장된 컨텐츠가 수익으로 더해짐 character.getTodoV2List()를 반복문을 돌려서 todoResponseDtoList 만들고 난 후토탈 골드 획득 높은 순으로 3개를 정렬하여 4번째 부터는 0골드로 변경-> 여기서 characterDto.setWeekGold 할 때, todoResponseDtoList랑 상관없이 character.getTodoV2List()여기에 있는게 더해짐 2 - 2. 백엔드 수정 -> todoResponseDtoList 생성 후 character.getTodoV2List() 반복문 한번 더 돌림..
[Java / Spring] @RequestMapping, @PatchVariable 있을때? 없을때?
·
Framework & Library/Spring
Spring으로 API를 만들다보면 @RequestMapping에 @PatchVariable이 있을때도 있고 없을때도 있다. 1. @RequestMapping이란? Spring 개발 시 특정 URL로 요청(Request)을 보내면 Controller에서 어떠한 방식으로 처리할지 정의 이때 들어온 요청을 특정 method와 매핑하기 위해 사용하는 어노테이션 DispatcherServlet이 Controller 파일을 찾고, 논리적 주소가 매핑된 Method를 찾음 @RestController public class MainController { @RequestMapping(value = "/main", method = RequestMethod.GET) public String Main(...) { ... ..