프로젝트 관련15 Spring boot - 로그백(Logback)을 통한 로그 파일 관리 들어가기 프로젝트를 진행 중, 실제 사용자로 인해 발생하는 예외 및 로그를 확실히 파악하기 위해서 로그를 기록한 파일을 정리하고자 하였다. 이를 위해 스프링에서 사용할 수 있는 로깅 프레임워크 중 하나인 Logback을 통해 진행하고자 한다. Logback은 SLF4J의 구현체이며 Spring Boot 환경이라면 별도의 dependency 추가 없이 기본적으로 포함되어 있어(spring-boot-starter-web), 간편하게 로그 처리를 진행할 수 있다. 아래와 같이 @Slf4j 어노테이션을 지정해 주는 것으로 해당 클래스 내에서 사용할 수 있으며, 로그 레벨(trace, debug, info, warn, error)에 따라 메서드를 사용하고 메시지를 남기면 쉽게 사용할 수 있다. @Slf4j@Re.. 2024. 10. 8. Spring boot - email 발송 기능 구현(with Gmail) 들어가기 spring boot를 통해 프로젝트를 진행하던 중 초대장을 메일로 전송하는 기능을 구현해야 하여 메일 전송에 대해서 알아보고자 한다. 일반 웹 통신(HTTP)와 다르게 메일 전송을 위해서는 SMTP를 사용한다. SMTP(Simple Mail Transfer Protocol)는 이메일을 전송하기 위해 사용되는 인터넷 표준 프로토콜이며, SMTP는 이메일 메시지를 작성한 후, 해당 메시지를 수신자에게 전달하는 과정에서 주로 사용된다. 이 프로토콜은 발신자의 이메일 서버에서 수신자의 이메일 서버로 메시지를 전송하는 역할을 한다.아래의 사진을 봐보자. 1. 발신자는 자신의 이메일 클라이언트에서 이메일 메시지를 작성하고, 수신자의 이메일 주소를 입력한 후 메시지를 전송한다. 2. 메시지(및 첨부 파일.. 2024. 8. 27. 일일 단위로 환율 DB 저장을 위한 스케줄링 구현(with Spring boot) 들어가기 프로젝트 진행 중 예산 관리하는 기능에서 달러, 엔에 따라 변환해야 하는 기능이 있다.이를 위해 환율을 적용해야 하는데, 매일 변하는 환율에 따라 이를 적용해야 한다.이를 위해 한국수출입은행 환율 정보 조회 API를 사용하고자 한다.일일 1000번 호출이 가능하기에 데이터베이스에 저장해 놓았다가 환율 변환 시 저장된 값을 통해 변환을 할 수 있도록 할 것이다. 이를 위해선 데이터 베이스에 매일 환율이 업데이트가 필요하다. 그렇기에 스프링 부트에 내장되어 있는 @Scheduled 어노테이션을 사용할 것이다. 스프링 부트 및 JPA를 사용하였고 스프링 부트 버전은 3.2.5 이다. 본론 1. 한국수출입은행 환율 정보 조회 API 활용 우선 환율 정보를 조회하기 위한 API를 신청해야 한다. 아래.. 2024. 8. 11. Spring boot with React: STOMP를 통해 채팅 시스템을 구현해보자(With Mysql, MongoDB)(2) 들어가기 이 글은 https://khdscor.tistory.com/121에서 이어진다. 여기선 의존성, Config 파일 등 세부적인 파일을 다루지 않고 바로 비즈니스 로직을 작성한 과정을 담았다. 이에 대해 궁금한 것은 이전 글을 참고하길 바란다.이 글에선 Mysql과 MongoDB과 함께 Spring boot와 React 연동 및 STOMP를 통한 간단한 채팅 시스템을 구현하는 과정을 작성하였다. 참고로 Spring boot 버전은 '3.2.5'이다.구현한 내용은 크게 3가지로 아래와 같다.1. 채팅방 리스트 조회, 새 채팅방 생성 2. 채팅방 별 이전에 작성한 채팅 리스트 조회3. 메시지 전송Mysql에는 채팅방 테이블만, MongoDB에는 채팅 내용 컬렉션만을 생성할 것이다.서번 단(Sprin.. 2024. 5. 17. Spring boot with React: STOMP를 통해 채팅 시스템을 구현해보자(With Mysql, MongoDB)(1) 들어가기 Spring boot로 채팅방을 구현하는 프로젝트를 진행하려고 한다. 채팅방은 실시간으로 채팅 내용을 저장할 수 있게 데이터베이스에 저장하도록 생각하였다. 하지만 채팅내용이 보내질 때마다 데이터베이스에 저장을 하는 비용이 발생한다. 이를 위한 해결 방법으로는 메모리에 채팅 내용을 저장해 두고 스케줄링하여 일정 주기마다 데이터베이스에 Bulk Insert 하는 방식, RDB보다 데이터 접근 비용이 적은 NoSQL을 사용하는 방식 등이 있다.나는 두번째 방법을 선택하여 NoSQL 중 MongoDB를 사용하기로 하였다.처음 프로젝트 설정부터 연동 및 React 부분까지 두 개의 글로 나눠서 작성할 것이다.이 글에선 데이터베이스 연동 없이 Spring boot와 React 연동 및 STOMP를 통한 .. 2024. 5. 13. 프로젝트 일지 - 쿼리 통합: 여러 번의 db접근을 감소시키자(with springboot, mysql, mybatis) 들어가기 현재 진행하는 프로젝트는 지도 위에 게시 글을 작성하는 웹 사이트이다. 게시글 페이지에 접근 시 위도, 경도의 정보와 게시글이 가지는 기본적인 정보 및 좋아요, 댓글, 댓글 좋아요 등 정보들을 확인할 수 있도록 하였다. 사용자가 게시글 페이지에 접근 시, 프론트 서버에서는 백엔드에 한번 접근 시 위 정보들을 모두 얻지만, 백엔드 서버에서 DB에 접근하는 횟수는 4번이다. DB 접근할 때마다 얻는 내용은 아래와 같다. 게시글 상세 정보 조회 게시글에 회원이 좋아요를 눌렀는지 조회 게시글에 달린 댓글 리스트 조회 댓글마다 회원이 좋아요를 눌렀는지 조회 게시글 페이지를 들어갈 시, 위 4번의 DB에 접근하는 메서드가 실행된다. 서버는 DB에 접근하는 경우에 비용이 발생하므로 최적화를 위해선 DB 접근.. 2023. 12. 25. Springboot With React: 커서 기반 페이징 기법을 통한 댓글 무한 스크롤 구현 들어가기 현재 진행 중인 프로젝트에서는 하나의 게시글에 있는 댓글을 조회할 때, 프론트 단에서 백엔드 단으로 요청을 할 때, 모든 댓글을 한꺼번에 가져오고 있다. 여기서 문제가 하나 있다면, 매우 많은 댓글이 넘어오게 된다면 DB 내에 매우 많은 '랜덤 액세스'가 일어나게 되어 성능적으로 좋지가 않다. 그렇기에 많이 페이징 방식을 사용해서 일부의 데이터를 조금씩 가져와야 한다. 페이징 방식하면 떠오르는 것은 페이지 번호가 있고 원하는 번호를 누르면 해당 번호의 페이지로 넘어가는 방식과 무한 스크롤 방식이 있다. 진행 중인 프로젝트는 모바일 화면에 맞춰서 개발을 하고 있기에 모바일 UI 에 더 익숙한 무한 스크롤 방식으로 댓글 페이징을 진행하고자 한다. 프로젝트에서는 Springboot, Mybatis, .. 2023. 10. 19. 스프링부트 With Mysql - easyRandom을 통한 bulk Insert 및 Index 적용 이 글은 개인적인 생각을 작성한 것이다. 들어가기 데이터베이스에 대해 공부하다 보면 마주치는 것 중 인덱스라는 것을 들어보았을 것이다. 필자 또한 인덱스라는 개념을 책 및 인터넷을 통해 많이 접하았다. 쿼리 최적화에 대해 공부하면서 인덱스 또한 공부도 하였다. 하지만 인덱스를 통해 충분한 성능을 보기 위해서는 충분한 데이터가 있어야 한다고 들었다. 그래서 데이터가 많지 않으니까 다음에 적용하자~! 라는 핑계로 계속 인덱스를 직접 적용해 보는 것을 미뤘었다. 그러던 중 최근에 EasyRandom을 통한 랜덤한 객체를 수백만 건을 생성해 주는 방법을 접하게 되었다. 지금까지 진행하던 테스트에서는 일일이 값을 집어넣어서 객체를 생성하고 테스트를 진행하였다. EasyRandom은 이런 나에게 매우 매혹적으로 보.. 2023. 8. 3. springboot delete시 DB접근, 쿼리 횟수에 대한 고찰(mybatis, jpa) 이 글은 프로젝트를 진행하면서 delete를 진행 시 mybatis 및 jpa를 사용하였을 때 DB에 접근하는 횟수 및 쿼리 횟수에 대해 비교하여 주관적으로 작성한 글이다. Article 테이블이 DB에 저장되어 있다고 하자. 여기서 Ariticle 하나를 delete 하려고 한다. jpa는 영속성 컨테스트라는 1차 캐시를 가지고 있다. 그렇기에 트랜젝션 안에서 select를 통해 Article 테이블 정보를 객체로 가져오면은 이에 해당하는 정보가 영속성 컨테스트에 저장된다. 그리고 delete를 실행하면 쿼리를 따로 저장해 놓았다가 트랜젝션 종료 시 저장해 놓은 쿼리를 DB에서 전달하여 실행하게 된다. 즉, article를 select하기 위해 DB접근 1회, 쿼리 실행 1회, 트랜젝션이 종료되면 쿼리.. 2023. 6. 24. 이전 1 2 다음