Java/Spring boot 프로젝트
[리팩토링 3] 쿼리 수정 및 최적화와 JMeter를 사용한 비교-게시판 만들기(16)
쿼리 수정 기존에는 QueryDSL을 사용하며 DTO조회를 사용하고 있다. 이를 최대한 Entity객체를 반환하도록 수정할 것이다. 그리고 만약 수정이 힘들더라도 QueryDSL에서 조회하는 DTO와 Service단에서 응답을 위해 사용하는 DTO는 구분하여 처리할 것이다. 의존 관계를 떨어뜨리기 위함이다! 게시글 상세 정보 조회의 쿼리를 최적화하면서 내가 수정한 방법이 정말 최적화가 됐는지 테스트를 해보고 어떤 것이 더 괜찮은지 고민해 볼 것이다. QueryDSL DTO조회를 Entity조회로 바꾸기 우선 내가 이렇게 조회 방식을 바꾸는 이유는 재사용성을 높일 수 있기 때문이다. 만약 같은 게시글 조회 쿼리라도 화면에서 보여줄 내용이 다르다면 DTO조회의 경우 새로운 DTO를 사용한 메서드를 만들어야 ..
[리팩토링 2] 의존성 관리하기 -게시판 만들기(15)
우선 해야할 것이 크게 코드 의존성 관리를 하며 구조를 변경하는 것과 쿼리문을 수정하고 성능을 향상하기위한 2가지 작업을 할 것이다. 오늘은 의존성 관리를 하며 구조를 변경하겠다. 첫 번째로 application계층과 service계층의 역할이 명확하게 분리되지 않았다. 현재 내 비즈니스의 구조는 controller → application → service → repository와 같은 흐름인데 application과 service가 중복되는 작업을 하고 있었다. 이를 명확하게 구분하기 위해 service에 비즈니스를 처리하는 로직을 넣어 책임을 명확하게 할 것이다. 그럼 application계층은 왜 필요하지? 라는 생각이 들지만 application은 service들을 여러개 호출하는 작업에 쓰이는..
[리팩토링 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 Security + JWT 적용하기(2) - 게시판 만들기(11)
Spring Security에 JWT를 붙이기 전에 JWT를 먼저 발급해 보겠다. 로그인 시 JWT 발급하기 먼저 JWT에 대한 작업을 할 클래스를 하나 생성한다. Security와 같은 모듈에서 utils 패키지를 만들어 관리를 할 것이다. 그러기 전에 먼저 의존성을 추가해 준다. build.gradle (common-authentication 모듈) dependencies { implementation 'org.springframework.boot:spring-boot-starter-security' //Spring Security implementation 'io.jsonwebtoken:jjwt:0.9.1' } jjwt 가 java json web. token이라고 한다. utils/JwtUtil ..
Spring Security + JWT 적용하기(1) - 게시판 만들기(10)
코드를 작성하기 전에 Spring Security가 무엇이고 왜 사용해야 하는지 알아보았다. Spring Security란? Spring 기반으로 어플리케이션 보안(인증, 권한, 인가 등) 기능을 제공하는 스프링 하위 프레임워크. Spring Security는 인증과 권한에 대한 부분을 Filter 흐름에 따라 처리한다. 이 Filter는 Dispatcher Servlet으로 가기 전에 적용되기 때문에 가장 먼저 URL의 요청을 받는다. Interceptor와는 다른 점이 Interceptor는 Dispatcher Servlet과 Controller 사이에 위치하기 때문에 적용되는 시점이 다른 차이가 있다. Spring Security는 보안과 관련하여 쳬계적으로 많은 옵션을 제공하기 때문에 개발자의 입..
Entity 모듈 분리(멀티 모듈 프로젝트) - 게시판 만들기(9)
본격적으로 시작하기에 앞서 도메인 별로 모듈을 분리를 한다면 그에 따라 Entity도 각자 가지고 있을 것이고 만약 이 Entity들이 다른 도메인에서도 사용된다면(연관 관계 등에 의해서) 공통 모듈로 분리하는 것이 좋다고 생각이 되었다. 우선 로그인 기능을 붙이고 싶었다. 로그인, 회원 가입 등이 발생하는 Auth-API와 사용자들 관련 Member-API 두 가지를 만드려 하니 두 곳 모두 Member라는 Entity가 공통으로 사용될 것 같다고 생각이 되었다. 그래서 Entity를 분리하기로 했고 Member와 MemberInfo로 나누어서 관계 설정하여 모듈화 시켜보겠다. Auth-API , Entity 모듈 생성 이전의 멀티 모듈 프로젝트 생성 과정에서 본 것과 같이 auth-api , enti..