1. Redis란?Redis는 Key:Value 구조의 비정형 데이터를 저장하고 관리하는 비관계형 데이터베이스이다. 데이터를 디스크가 아닌 메모리에 저장하므로 인메모리 DB(In-Memory DB)라고 부른다. 2. 데이터베이스가 있는데, 왜 Redis를 사용할까?데이터베이스가 있음에도 Redis를 사용하는 이유는 CPU가 계산에 필요한 데이터를 얻기 위한 속도 차이가 발생하기 때문이다. 데이터베이스는 물리 디스크에 직접 데이터를 쓰기 때문에 서버에 장애가 발생하더라도 데이터가 손실되지 않는다. 그러나 데이터가 필요할 때마다 매번 디스크에 접근하게 되면 사용자가 많아질수록 데이터베이스에 부하가 발생하게 된다. 따라서 사용자가 많을 때 데이터베이스의 과부하를 줄이기 위해서 Redis와 같은 캐시 서버를 도..
Username과 Password를 입력하여 인증하는 방법으로, Spring Security에서 사용되는 3가지 방식은 다음과 같습니다.InMemoryUserDetailsManagerJdbcUserDetailsManagerCustomUserDetailsManagerAuthenticationManager는 사용자의 Username과 Password에 기반하여 인증을 처리하도록 AuthenticationProviders에 인증 책임을 위임합니다. Authentication Providers의 구현체 중 하나인 DaoAuthenticationProvider가 인증을 담당합니다. DaoAuthenticationProvider 또한 UserDetailsService에 인증 책임을 위임합니다. InMemoryUse..
생성된 QR 코드의 만료 시간을 설정하고 DB에 저장하고자 하였다. 그러나.... 둘 간의 시간 오차가 발생했다. 분명 스프링에서는 2024-04-24T16:05:24.911197 로 생성이 되는데, DB에서는 2024-04-24 07:05:24.911197 로 저장되는 문제가 있었다. 그 이유는 간단했다. DB의 serverTimezone=UTC 로 설정되어 있었기 때문이다. 스프링은 당연히 KST 기준으로 시간을 설정하기 때문에 UTC와 오차가 발생한다. 따라서 기존의 serverTimezone을 수정한다.수정 전spring: datasource: url: jdbc:mysql://localhost:3306/qr_code?serverTimezone=UTC&characterEn..
벌크 연산 벌크 연산이란 1개 이상의 데이터를 update 할 때 사용합니다. 벌크 연산 사용 X 식별자를 통해 Entity를 조회하여 변경 감지(Dirty Checking)를 사용합니다. 따라서 식별자에 해당하는 1개의 데이터에만 update가 수행됩니다. @Repository @RequiredArgsConstructor public class MemberJpaRepository { private final EntityManager em; public void update(Member member, Team team) { Member findMember = em.find(Member.class, member.getId()); findMember.changeTeam(team); } } 벌크 연산 사용 O..
원인 DB에서 기본키를 자동으로 증가하는 전략을 사용할 때, 서버에서 DB에 등록된 키를 가져오지 못해서 발생하는 오류 코드 public Long enrolBoard(BoardEnrolDto boardEnrolDto) { KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(connection -> { PreparedStatement stmt = connection.prepareStatement("INSERT INTO Board(title, name, content, created_date, view_cnt) VALUES(?, ?, ?, ?, ?)"); stmt.setString(1, boardEnrolDto.getTitle()); st..