Skip to content

Commit

Permalink
[CI/CD] DB 스키마 업데이트 v.1 (#73)
Browse files Browse the repository at this point in the history
* [BSVR-134] github release 관련한 github action 스크립트 파일 수정 및 배포 테스트 (#48)

* refactor: 로컬 데이터베이스로  url 설정

* refactor: github release 트리거 방식 수정

* refactor: github actions dev 브랜치 포함하도록 트리거 수정

* refactor: 배포 테스트

* feat: 배포시 jwt와 oauth 환경변수 직접 세팅

* feat: 배포시 jwt 환경변수 직접 세팅

* feat: ddl-auto를 배포 시 validate 옵션으로 세팅

* feat: 좌석배치도 미리보기 파일 확장자 변경 (#51)

* feat: max file size, max request size 조정 (#52)

* [BSVR-137] 복수 팀 등록 API를 단일 등록으로 수정 (#53)

* feat: 복수 팀 등록 API를 단일 등록으로 수정

* fix: 오타 수정

* feat: request body -> reqeust param form data로 변경

* test: 중복 팀 이름 확인 테스트 코드 수정

* [BSVR-138] ncp object storage 환경변수 추가 (#54)

* feat: ncp object storage 환경변수 추가

* feat: object storage api 정상 작동 테스트 완료 -> action 트리거  롤백

* fix: 불필요한 정렬 삭제 (#55)

* feat: 전체 경기장 조회 API에 isActive, 이름 오름차순 정렬 추가 (#56)

* [NO_JIRA] JwtTokenResponse 추가 (#57)

* feat : JwtTokenResponse 구현

* refactor : 1년 동안 유요한 토큰 발급

* refactor : Jwt 토큰을 바디에 리턴하도록 변경

* feat: 이름 정렬 추가 (#58)

* [NO_JIRA] Jwt 토큰 관련 이슈 & Swagger authenticate 설정 (#59)

* feat: 필터 설정, 스웨거 설정 추가

* fix: 토큰 만료 시간 수정

* refactor : 안드로이드에 맞도록 accessToken으로 회원가입/로그인 처리 (#61)

* refactor : 로그인 시 존재하지 않는 유저는 빈 JWT 리턴하도록 변경 (#62)

* feat: 구역내 블록 조회시 블럭 코드 오름차순 정렬 (#63)

* feat : 멤버 삭제 API 구현 (#64)

* [BSVR-143] 블럭 열별 좌석 범위 조회 API res 수정 (#65)

* feat: 구역 / 블록별 좌석 범위 리스트 조회 API res 수정

* fix: 블록, 열 그룹핑 로직 수정

* [BSVR-78] Jwt 토큰 수정, 헤더 jwt 토큰에서 memberId 가져오는 AOP 추가 (#66)

* fix : 정상적인 토큰을 소유해도 401 오류가 나던 것 해결

* build : aop를 위한 의존성 추가

* refactor : jwt 내의 memberId String -> Long 타입 변경

* feat : MemberId 어노테이션 추가

* feat : 헤더의 jwt 토큰에서 memberId 가져오는 AOP 추가

* refactor : 필요 없는 로깅, Long 타입 변환 제거

* refactor : 해결된 Before 어노테이션 이슈 주석 삭제

* feat : JwtTokenUtil에 accessToken 기능 추가

* refactor : camel 케이스에 맞도록 수정

* feat : BEARER enum 추가

* refactor : BEARER enum 사용

* refactor : BEARER 상수 사용

* refactor : MemberId -> CurrentMember 이름 변경

* refactor : 완료된 TODO 제거

* [BSVR-117] 특정 좌석 리뷰 등록 API 구현 및 Review 엔티티 수정과 기타 API 쿼리문 수정 (#47)

* feat: 리뷰 등록 컨트롤러 추가

* feat: 누락된 Transactional 어노테이션들 추가

* feat: 리뷰 저장

* fix: review entity 원복

* feat: 리뷰 이미지 저장

* feat: 리뷰 작성 후 유저 레벨 조정

* feat: seat_id 추가

* test: save 수정하면서 깨진 테스트 해결

* feat: review entity 및 domain 수정

* feat: 공통적으로 사용되는 response dto 추출

* feat: 재사용성을 위한 response dto 분리 및 monthresponse 추가

* feat: memberesponse dto 추가 및 내 리뷰 response dto 추가

* feat: keyword와  review 엔티티 필드 및 메서드 수정

* feat: 응답, 요청방식에 따른 도메인 구조 업데이트

* feat: request와 review 도메인 업데이트

* feat: 컨트롤러, usecase, service 업데이트

* feat: 레포지토리 및 유스케이스 업데이트

* feat: review쪽 엔티티 스키마 업데이트

* feat: 수정된 엔티티에 따라 도메인 재정의

* feat: 엔티티들의 toDomain, from 메서드 정의

* feat: controller에서 pageable 사용하기 위해 jpa 의존성 부여 -> 체크 필요

* feat: pageable 도입(offset, limit 파라미터 삭제), 메서드명 변경

* feat: pageable 도입(offset, limit 파라미터 삭제), 메서드명 변경

* feat: 내 리뷰 조회 request에 pageable 도입

* feat: 매핑역할을 했던 keyword 도메인과 엔티티 삭제

* feat: keyword에 매핑되어있던 필드를 reviewkeyword로 이관

* feat: review 엔티티와 도메인에 sectionId와 section 도메인 필드 추가

* feat: reviewkeyword에 keyword 테이블 통합 및 도메인 수정

* feat: 블록별 조회 request, response dto 수정 및 usecase 반환형 result 수정

* feat: 리뷰 조회 controller, usecase, service 작성

* feat: 리뷰 조회 repository 인터페이스 정의

* feat: 리뷰조회 repository 정의

* feat: base review response에 열 정보를 담은 row response dto 추가

* feat: 내 리뷰 조회 유스케이스 반환형 result 정의

* feat: 내 리뷰 조회 response dto 정의

* feat: 리뷰 키워드 reponse 정의

* feat: 컨트롤러와 usecase 내기록조회  result 경로 업데이트 및 토큰 방식에서 memberId 파라미터로 받아오도록 rollback

* feat: 내 리뷰 조회 request dto

* feat: review 도메인에서 builder를 사용할 때 image, keyword를 선택적으로 포함 + addImagesAndKeywords 메서드 추가

* feat: 리뷰 등록 서비스 작성

* feat: 리뷰 등록 유스케이스 도메인 구조에 맞게 수정

* feat: 리뷰등록 컨트롤러 반환타입 base review response dto로 업데이트

* feat: review repository 및 review entity 컬럼명 user_id ->member_id로 업데이트

* feat: review image 레포지토리 구현

* feat: review keyword 레포지토리 구현

* refactor: review entity 주석 삭제

* refactor: 리뷰쪽 엔티티 구조 변경, KeywordEntity 다시 따로 분리

* feat: 리뷰 등록 api 구현 (영속성 에러)

* feat: from 메서드 역할을 하는 with- 메서드 작성

* feat: setId 정의

* feat: block top keyword repository쪽 구현

* feat: 엔티티구조 업데이트 및 from, to 메서드 수정

* feat: keyword쪽 repository 구현

* feat: review image쪽 repository 구현

* refactor: 이름 변경

* feat: db주소 localhost로 업데이트 + 로깅 설정 추가

* feat: 아직 구현 못한부분 주석처리

* feat: conflict 해결을 위한 spotless 커밋

* feat: conflict 해결을 위한 spotless 커밋

---------

Co-authored-by: Minseong Park <pminsung12@gmail.com>
Co-authored-by: Minseong Park <52368015+pminsung12@users.noreply.github.com>

* [NO_JIRA] members 테이블 내의 사용하지 않는 컬럼 제거 (#68)

* refactor : 사용하지 않는 myTeam 컬럼 제거

* refactor : 사용하지 않는 myTeam 컬럼 제거

* [BSVR-132] 블록별 리뷰조회 API, 유저별 리뷰조회 API, 유저별 리뷰 작성 날짜 조회 API 업데이트 (#69)

* feat: 리뷰 등록 컨트롤러 추가

* feat: 누락된 Transactional 어노테이션들 추가

* feat: 리뷰 저장

* fix: review entity 원복

* feat: 리뷰 이미지 저장

* feat: 리뷰 작성 후 유저 레벨 조정

* feat: seat_id 추가

* test: save 수정하면서 깨진 테스트 해결

* feat: review entity 및 domain 수정

* feat: 공통적으로 사용되는 response dto 추출

* feat: 재사용성을 위한 response dto 분리 및 monthresponse 추가

* feat: memberesponse dto 추가 및 내 리뷰 response dto 추가

* feat: keyword와  review 엔티티 필드 및 메서드 수정

* feat: 응답, 요청방식에 따른 도메인 구조 업데이트

* feat: request와 review 도메인 업데이트

* feat: 컨트롤러, usecase, service 업데이트

* feat: 레포지토리 및 유스케이스 업데이트

* feat: review쪽 엔티티 스키마 업데이트

* feat: 수정된 엔티티에 따라 도메인 재정의

* feat: 엔티티들의 toDomain, from 메서드 정의

* feat: controller에서 pageable 사용하기 위해 jpa 의존성 부여 -> 체크 필요

* feat: pageable 도입(offset, limit 파라미터 삭제), 메서드명 변경

* feat: pageable 도입(offset, limit 파라미터 삭제), 메서드명 변경

* feat: 내 리뷰 조회 request에 pageable 도입

* feat: 매핑역할을 했던 keyword 도메인과 엔티티 삭제

* feat: keyword에 매핑되어있던 필드를 reviewkeyword로 이관

* feat: review 엔티티와 도메인에 sectionId와 section 도메인 필드 추가

* feat: reviewkeyword에 keyword 테이블 통합 및 도메인 수정

* feat: 블록별 조회 request, response dto 수정 및 usecase 반환형 result 수정

* feat: 리뷰 조회 controller, usecase, service 작성

* feat: 리뷰 조회 repository 인터페이스 정의

* feat: 리뷰조회 repository 정의

* feat: base review response에 열 정보를 담은 row response dto 추가

* feat: 내 리뷰 조회 유스케이스 반환형 result 정의

* feat: 내 리뷰 조회 response dto 정의

* feat: 리뷰 키워드 reponse 정의

* feat: 컨트롤러와 usecase 내기록조회  result 경로 업데이트 및 토큰 방식에서 memberId 파라미터로 받아오도록 rollback

* feat: 내 리뷰 조회 request dto

* feat: review 도메인에서 builder를 사용할 때 image, keyword를 선택적으로 포함 + addImagesAndKeywords 메서드 추가

* feat: 리뷰 등록 서비스 작성

* feat: 리뷰 등록 유스케이스 도메인 구조에 맞게 수정

* feat: 리뷰등록 컨트롤러 반환타입 base review response dto로 업데이트

* feat: review repository 및 review entity 컬럼명 user_id ->member_id로 업데이트

* feat: review image 레포지토리 구현

* feat: review keyword 레포지토리 구현

* refactor: review entity 주석 삭제

* refactor: 리뷰쪽 엔티티 구조 변경, KeywordEntity 다시 따로 분리

* feat: 리뷰 등록 api 구현 (영속성 에러)

* feat: from 메서드 역할을 하는 with- 메서드 작성

* feat: setId 정의

* feat: block top keyword repository쪽 구현

* feat: 엔티티구조 업데이트 및 from, to 메서드 수정

* feat: keyword쪽 repository 구현

* feat: review image쪽 repository 구현

* refactor: 이름 변경

* feat: db주소 localhost로 업데이트 + 로깅 설정 추가

* feat: 아직 구현 못한부분 주석처리

* feat: conflict 해결을 위한 spotless 커밋

* feat: conflict 해결을 위한 spotless 커밋

* refactor: CreateReviewService.java 주석 제거

* refactor: 리뷰쪽 엔티티 주석제거

* feat: 리뷰 조회 controller 및 usecase 정의 + dto 수정

* feat: review repository 쪽 정의

* feat: review image repository 쪽 정의

* feat: keyword repository 쪽 정의

* chore: 사용하지 않는 myreviewlistresult 삭제

* feat: block top keyword repository 쪽 구현

* feat: review jpa repository 구현

* feat: 엔드포인트에 @CurrentMember를 통해 인증절차 적용

* chore: 사용하지 않는 코드, 주석 삭제

* feat: 삭제 api를 위한 base entity 메서드 정의

* feat: review 객체에 keyword값 map으로 매핑

---------

Co-authored-by: EunjiShin <eunji980310@gmail.com>

* [BSVR-146] MemberInfo API 구현 (#67)

* feat : 홈 화면 멤버 정보 호출 API

* feat : 홈 피드 화면 필터 제외

* feat : 홈 피드 화면 조회 API 구현

* fix : 정상적인 토큰을 소유해도 401 오류가 나던 것 해결

* build : aop를 위한 의존성 추가

* refactor : jwt 내의 memberId String -> Long 타입 변경

* feat : MemberId 어노테이션 추가

* feat : 헤더의 jwt 토큰에서 memberId 가져오는 AOP 추가

* refactor : CurrentMember를 사용해 memberId 가져오도록 수정

* feat : (홈 피드 API 분리) MemberInfo API 구현

* refactor : (홈 피드 API 분리) MemberInfo만 제공하도록 변경

* refactor : (홈 피드 API 분리) MemberInfo만 제공하도록 변경

* refactor : API 메소드명 변경(findMemberInfo)

* refactor : (홈 피드 API 분리) 제거된 Home url 삭제

* refactor : 중복된 커스텀 어노테이션 제거

* refactor : findMemberInfo 일기 전용 -> readOnly = true 설정

* feat: dev-build-and-deploy.yaml ddl-auto 옵션 update로 변경 (#70)

* feat: blockId, seatNumber를 이용하도록 리뷰 생성 API 수정 (#72)

* [BSVR-151] ddl-auto update 옵션으로 deploy (#71)

* feat: ddl-auto update 옵션으로 deploy

* feat: ddl-auto validate 옵션으로 deploy

* feat: Update dev-build-and-deploy.yaml

* feat: ddl auto 옵션 삭제

---------

Co-authored-by: 우디 <38103085+EunjiShin@users.noreply.github.com>
Co-authored-by: junwon <67488973+wjdwnsdnjs13@users.noreply.github.com>
Co-authored-by: EunjiShin <eunji980310@gmail.com>
  • Loading branch information
4 people authored Jul 23, 2024
1 parent 1836a2d commit 7ca95be
Show file tree
Hide file tree
Showing 140 changed files with 3,361 additions and 1,260 deletions.
13 changes: 12 additions & 1 deletion .github/workflows/dev-build-and-deploy.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@ on:
push:
branches:
- main
- dev
pull_request:
branches:
- main
- dev

jobs:
build-and-test:
Expand Down Expand Up @@ -70,7 +72,7 @@ jobs:
deploy:
needs: build-and-test
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
# if: (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev') && github.event_name == 'push'
runs-on: ubuntu-latest

steps:
Expand Down Expand Up @@ -109,11 +111,19 @@ jobs:
-e SPRING_DATASOURCE_URL=${{ secrets.DEV_DB_URL }} \
-e SPRING_DATASOURCE_USERNAME=${{ secrets.DEV_DB_USERNAME }} \
-e SPRING_DATASOURCE_PASSWORD=${{ secrets.DEV_DB_PASSWORD }} \
-e SPRING_JWT_SECRET=${{ secrets.JWT_SECRET }} \
-e OAUTH_CLIENTID=${{ secrets.KAKAO_CLIENT_ID }} \
-e OAUTH_KAUTHTOKENURLHOST=${{ secrets.KAUTH_TOKEN_URL_HOST }} \
-e OAUTH_KAUTHUSERURLHOST=${{ secrets.KAUTH_USER_URL_HOST }} \
-e NCP_OBJECT_STORAGE_ACCESS_KEY=${{ secrets.NCP_OBJECT_STORAGE_ACCESS_KEY }} \
-e NCP_OBJECT_STORAGE_SECRET_KEY=${{ secrets.NCP_OBJECT_STORAGE_SECRET_KEY }} \
-e TZ=Asia/Seoul \
${{ secrets.DOCKERHUB_USERNAME }}/spot-server:dev-${{ github.sha }}
docker system prune -af
create-release:
needs: [ build-and-test, deploy ] # deploy job이 성공적으로 완료된 후에만 실행
# if: github.event.pull_request.merged == true # PR이 merge된 경우에만 실행
runs-on: ubuntu-latest
permissions:
contents: write
Expand All @@ -133,3 +143,4 @@ jobs:
tag: ${{ steps.tag_version.outputs.new_tag }}
name: Release ${{ steps.tag_version.outputs.new_tag }}
body: ${{ steps.tag_version.outputs.changelog }}

4 changes: 4 additions & 0 deletions application/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-validation")
implementation("org.springframework:spring-aspects")
implementation("org.springframework.boot:spring-boot-starter-data-jpa") // pageable

// security
implementation("org.springframework.boot:spring-boot-starter-security")
Expand All @@ -23,6 +24,9 @@ dependencies {
implementation("io.jsonwebtoken:jjwt-impl:0.11.5")
implementation("io.jsonwebtoken:jjwt-jackson:0.11.5")

// aop
implementation("org.springframework.boot:spring-boot-starter-aop")

}

// spring boot main application이므로 실행 가능한 jar를 생성한다.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
package org.depromeet.spot.application.block.dto.response;

import java.util.List;

import org.depromeet.spot.usecase.port.in.block.BlockReadUsecase.RowInfo;

import lombok.Builder;

@Builder
public record RowInfoResponse(Long id, int number, int minSeatNum, int maxSeatNum) {
public record RowInfoResponse(Long id, int number, List<Integer> seatNumList) {

public static RowInfoResponse from(RowInfo rowInfo) {
return RowInfoResponse.builder()
.id(rowInfo.getId())
.number(rowInfo.getNumber())
.minSeatNum(rowInfo.getMinSeatNum())
.maxSeatNum(rowInfo.getMaxSeatNum())
.seatNumList(rowInfo.getSeatNumList())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.depromeet.spot.application.common.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* 해당 어노테이션은 헤더에 담긴 Jwt 토큰에서 <b>memberId</b> 값을 가져오는 어노테이션입니다. <br>
* 컨트롤러에서 사용하려는 <b>메소드</b>에 사용하면됩니다. <br>
* <br>
* <b>파라미터</b>에 <b>Long memberId</b>를 추가해주어야 합니다. <br>
* <b>@Parameter(hidden = true) Long memberId</b>로 하시면 <br>
* 해당 파라미터는 Swagger에서 제외됩니다. :)
*/
@Target(ElementType.METHOD) // 적용 대상 : 메소드
@Retention(RetentionPolicy.RUNTIME) // 런타임에 사용할 수 있도록 설정
public @interface CurrentMember {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package org.depromeet.spot.application.common.aop;

import jakarta.servlet.http.HttpServletRequest;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.depromeet.spot.application.common.jwt.JwtTokenUtil;
import org.springframework.stereotype.Component;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Component
@Aspect
@RequiredArgsConstructor
@Slf4j
public class JwtTokenAspect {

private final JwtTokenUtil jwtTokenUtil;

private final HttpServletRequest request;

@Around("@annotation(org.depromeet.spot.application.common.annotation.CurrentMember)")
public Object getMemberIdFromTokenAspect(ProceedingJoinPoint joinPoint) throws Throwable {
Long memberId = jwtTokenUtil.getIdFromJWT(jwtTokenUtil.getAccessToken(request));

// 동작하는 메소드의 시그니처를 가져옴.
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Object[] args = joinPoint.getArgs();
Class<?>[] parameterTypes = signature.getParameterTypes();
String[] parameterNames = signature.getParameterNames();

for (int i = 0; i < args.length; i++) {
if ("memberId".equals(parameterNames[i]) && parameterTypes[i] == Long.class) {
args[i] = memberId; // memberId로 변경
}
}

// 변경된 인자로 메서드 실행
return joinPoint.proceed(args);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,18 @@ public class SecurityConfig {

private final JwtTokenUtil jwtTokenUtil;

private static final String[] AUTH_WHITELIST = {
"/api/**",
"/swagger-ui/**",
"/api-docs",
"swagger-ui-custom.html",
"/v3/api-docs/**",
"/api-docs/**",
"/swagger-ui.html",
"/favicon.ico/**",
"/api/v1/members/**"
};

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
Expand All @@ -31,9 +43,10 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
.authorizeHttpRequests(
authorize ->
authorize
// 테스트, 개발 중엔 모든 경로 오픈.
.requestMatchers("/**")
.permitAll())
.requestMatchers(AUTH_WHITELIST)
.permitAll()
.anyRequest()
.authenticated())
// UsernamePasswordAuthenticationFilter 필터 전에 jwt 필터가 먼저 동작하도록함.
.addFilterBefore(
new JwtAuthenticationFilter(jwtTokenUtil),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@

@ComponentScan(basePackages = {"org.depromeet.spot.application"})
@Configuration
@Import(value = {UsecaseConfig.class, JpaConfig.class, NcpConfig.class})
@Import(value = {UsecaseConfig.class, JpaConfig.class, NcpConfig.class, SwaggerConfig.class})
public class SpotApplicationConfig {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package org.depromeet.spot.application.common.config;

import java.util.List;

import jakarta.servlet.ServletContext;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import io.swagger.v3.oas.models.security.SecurityScheme.In;
import io.swagger.v3.oas.models.security.SecurityScheme.Type;
import io.swagger.v3.oas.models.servers.Server;
import lombok.RequiredArgsConstructor;

@Configuration
@RequiredArgsConstructor
public class SwaggerConfig {

@Bean
public OpenAPI openAPI(ServletContext servletContext) {
String contextPath = servletContext.getContextPath();
Server server = new Server().url(contextPath);
return new OpenAPI()
.servers(List.of(server))
.addSecurityItem(new SecurityRequirement().addList("accessToken"))
.components(authSetting())
.info(swaggerInfo());
}

private Info swaggerInfo() {
return new Info()
.version("v0.0.1")
.title("야구장 좌석 시야 서비스, SPOT API 문서")
.description("SPOT 서버의 API 문서입니다.");
}

private Components authSetting() {
return new Components()
.addSecuritySchemes(
"accessToken",
new SecurityScheme()
.type(Type.HTTP)
.scheme("Bearer")
.bearerFormat("JWT")
.in(In.HEADER)
.name("Authorization"));
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.depromeet.spot.application.common.jwt;

import java.io.IOException;
import java.util.List;
import java.util.Arrays;

import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
Expand All @@ -26,41 +26,40 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {

private final JwtTokenUtil jwtTokenUtil;

private static final String[] AUTH_WHITELIST = {
"/swagger-ui",
"/api-docs",
"swagger-ui-custom.html",
"/v3/api-docs",
"/api-docs",
"/swagger-ui.html",
"/favicon.ico",
"/api/v1/members"
};

@Override
protected void doFilterInternal(
HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {

List<String> list =
List.of(
// swagger-ui와 v3/api-docs는 스웨거를 제외하기 위해 등록.
// 혹시나 스웨거 자원 사용 에러 발생 시 아래 두 가지 추가 필요함.
// Swagger UI에서 사용하는 외부 라ㅇ이브러리 제공 엔드포인트 : "/webjars/**"
// Swagger UI에서 사용하는 리소스 제공 엔드포인트 : "/swagger-resources/**"
// 로그인, 회원가입은 제외
"/swagger-ui", "/v3/api-docs", "/api/v1/members", "/kakao/", "/api/v1/");

// 현재 URL 이 LIST 안에 포함되있는걸로 시작하는가?
boolean flag = list.stream().anyMatch(url -> request.getRequestURI().startsWith(url));

if (flag) {
String header = request.getHeader(HttpHeaders.AUTHORIZATION);
final String requestURI = request.getRequestURI();
if (Arrays.stream(AUTH_WHITELIST).anyMatch(requestURI::startsWith)) {
filterChain.doFilter(request, response);
return;
}

String header = request.getHeader(HttpHeaders.AUTHORIZATION);
log.info("JwtAuthenticationFilter header : {}", header);

// header가 null이거나 빈 문자열이면 안됨.
if (header != null && !header.equalsIgnoreCase("")) {
if (header.startsWith("Bearer")) {
String access_token = header.split(" ")[1];
if (jwtTokenUtil.isValidateToken(access_token)) {
String memberId = jwtTokenUtil.getIdFromJWT(access_token);
MemberRole role = MemberRole.valueOf(jwtTokenUtil.getRoleFromJWT(access_token));
if (header.startsWith(JwtTokenEnums.BEARER.getValue())) {
String accessToken = header.split(" ")[1];
if (jwtTokenUtil.isValidateToken(accessToken)) {
Long memberId = jwtTokenUtil.getIdFromJWT(accessToken);
MemberRole role = MemberRole.valueOf(jwtTokenUtil.getRoleFromJWT(accessToken));
JwtToken jwtToken = new JwtToken(memberId, role);
SecurityContextHolder.getContext().setAuthentication(jwtToken);
filterChain.doFilter(request, response);
return;
}
}
// 토큰 검증 실패 -> Exception
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@
@Getter
@AllArgsConstructor
public class JwtToken implements Authentication {
// TODO : Authentication을 상속받고 UserDetail을 상속받은 커스텀 유저 정보 객체 생성해줘야함.
private String memberId;
private Long memberId;
private MemberRole memberRole;

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.depromeet.spot.application.common.jwt;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum JwtTokenEnums {
BEARER("Bearer");

private final String value;
}
Loading

0 comments on commit 7ca95be

Please sign in to comment.