SpringBoot

    코드리뷰 적용, 다시 Redis로.. - MiniPay(5)

    코드 리뷰이전에는 굳이 Redis를 사용할 필요가 없다고 생각해서 MySQL을 사용하여 기능을 구현했다. 해당 기능은 이체 트랜잭션을 분리하여 발생한 데이터 정합성 문제를 해결하기 위해 이체 발생 로그를 저장하는 기능이다. 하지만 코드 리뷰에서 데이터가 오래 유지되지 않고 금방 사라져도 되는 데이터라는 점에서 Redis와 같은 메모리 기반의 DB 사용하면 좋겠다는 리뷰를 받았다. 이전에도 Redis를 사용하면 된다고 생각했지만 delete 연산 때문에 사용하지 않은 것인데 뭔가 다른 방법이 필요했다. 현재 producer, consumer 구조를 사용하고 있기에 Redis를 해당 구조에서 사용할 방법을 찾아보았다.Redis Stream찾아보니 Redis가 지원하는 많은 데이터 형식 중 Stream이라는 ..

    [리팩토링 3] 쿼리 수정 및 최적화와 JMeter를 사용한 비교-게시판 만들기(16)

    쿼리 수정 기존에는 QueryDSL을 사용하며 DTO조회를 사용하고 있다. 이를 최대한 Entity객체를 반환하도록 수정할 것이다. 그리고 만약 수정이 힘들더라도 QueryDSL에서 조회하는 DTO와 Service단에서 응답을 위해 사용하는 DTO는 구분하여 처리할 것이다. 의존 관계를 떨어뜨리기 위함이다! 게시글 상세 정보 조회의 쿼리를 최적화하면서 내가 수정한 방법이 정말 최적화가 됐는지 테스트를 해보고 어떤 것이 더 괜찮은지 고민해 볼 것이다. QueryDSL DTO조회를 Entity조회로 바꾸기 우선 내가 이렇게 조회 방식을 바꾸는 이유는 재사용성을 높일 수 있기 때문이다. 만약 같은 게시글 조회 쿼리라도 화면에서 보여줄 내용이 다르다면 DTO조회의 경우 새로운 DTO를 사용한 메서드를 만들어야 ..

    [리팩토링 1] nGrinder삽질 + JMeter 부하 테스트 해보기 - 게시판 만들기(14)

    로그인 기능 이후 게시글과 댓글 기능까지 만들었다. 리팩토링 하기 전에 부하 테스트를 해보고 성능에 문제가 있는 것을 한 번에 리팩토링하면 좋을 것 같아 시도해 보았다. nGrinder 삽질 아래는 nGrinder 오픈소스 링크이다. 여기서 알맞은 버전을 다운로드하여 사용해야 한다. https://github.com/naver/ngrinder/releases 내가 그냥 최신버전 했다가 삽질을 엄청 했는데 현재 내 환경은 macOS Ventura 13.4.1 java openjdk8 을 사용했다. openjdk8을 사용한 이유는 8 버전이 가장 잘 된다고 한다. 11도 되는 것 같지만 시도해보지 않았다. 우선 이 환경에서 nGrinder 3.5.8 버전이 되지 않아서 3.5.6 버전을 다운로드하여서 실행하..

    @EntityListener로 생성일, 수정일 자동으로 넣기 + 프록시 활용(연관관계 Insert) - 게시판 만들기(13)

    이전에 회원가입, 로그인까지 만들었다. 나의 경우 간단하게 상세 정보도 만들어 1대 1 매핑을 했다. 이런 간단한 비즈니스들은 본인이 원하는 대로 만들면 될 것 같다. 게시글 Entity를 만들기 전에 게시글은 생성일, 수정일이 필요할 것 같아 해당 기능을 자동으로 하기 위해 JPA Auditing을 사용해보려고 한다. JPA Auditing JPA Auditing이란? JPA에서 시간 값을 자동으로 넣어주는 기능이다. Entity를 영속화 시키거나 조회를 수행한 후에 update를 하는 경우 매번 시간을 읽어와서 저장해 주는 번거로움이 있는데 JPA Auditing을 사용하면 자동으로 시간을 매핑하여 DB 테이블에 넣어준다. 사용하기 전에 이게 정말 좋을까?에 대한 생각이 들었다. 사실 자동으로 다 해..

    Spring Security + JWT 적용하기(3) - 게시판 만들기(12)

    로그인 구현 마지막 기능으로 로그아웃과 내 개인적인 보안 강화?를 적용해 보겠다. 우선 내 로그인 로직은 클라이언트가 로그인을 한다. 로그인 성공하면 accessToken, refreshToken을 건네준다. accessToken이 만료되면 로그인 유지를 위해 refreshToken으로 재발급 요청을 보낸다. refreshToken이 유효하면 accessToken을 발급한다. refreshToken이 유효하지 않다면 토큰을 만료시키고 강제 로그아웃 처리를 한다. 크게 이런 흐름이다. 내가 생각한 나름의 보안 강화는 4번에 적용시켰고, refreshToken이 유효해도 accessToken이 유효하지 않다면 비정상적인 접근으로 판단하여 강제 로그아웃 처리를 하였다. 이후 해당 accessToken은 따로 ..

    Spring 공통 응답 만들기(Enum, 제네릭 타입) - 게시판 만들기(5)

    이전에 공통 응답 클래스를 만들어서 활용하기는 했지만 보기에만 조금 더 깔끔해진 것 같지 사용하기 좋아보이지는 않는다. 오늘은 공통 응답을 조금 더 수정하기 쉽고 사용하기 좋게 바꾸려고 한다. controller/MemberController package com.seungh1024.controller; import com.seungh1024.Response; import com.seungh1024.entity.Member; import com.seungh1024.service.MemberService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.uti..

    JPA 레포지터리, Member CRUD - 게시판 만들기(4)

    Repository Repository란? 엔티티에 의해 생성된 데이터베이스 테이블에 접근하는 메서드들(findAll, save 등)을 사용하기 위한 인터페이스이다. 데이터 처리를 위해 테이블에 어떤 값을 넣거나 조회하거나 업데이트하거나 삭제시키는 등의 CRUD(Create, Read, Update, Delete)가 필요하다. 이때 CRUD를 어떻게 처리할지 정의하는 계층이 Repository이다. CRUD 데이터 조회하기 api 모듈에 새로운 패키지인 repository를 만들고 MemberRepository 인터페이스를 생성한다. repository/MemberRepository package com.seungh1024.repository; import com.seungh1024.entity.Memb..

    Spring Boot Mysql 연결, 민감한 정보 관리하기(환경 변수 설정하기)- 게시판 만들기(2)

    멀티 모듈을 활용하여 직접 게시판 서비스를 만들어보려고 한다. 우선 api 모듈을 하나 만들면 아래와 같은 파일 구조가 나올 것이다. 이전의 멀티 모듈과 다른 점은 멀티 모듈을 ‘server’라는 파일 아래에 위치시켰다. 비슷한 성격의 모듈들을 저 ‘server’ 파일에서 관리하기 위함이다. build.gradle(루트 프로젝트) plugins { id 'java' id 'org.springframework.boot' version '3.0.2' id 'io.spring.dependency-management' version '1.1.0' } repositories { mavenCentral() } bootJar.enabled = false subprojects{ group = 'com.seungh102..