Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BE] Feature/#422 성능 측정을 위한 로깅 구현 #434

Merged
merged 9 commits into from
Sep 19, 2023

Conversation

cpot5620
Copy link
Collaborator

작업 대상

#422

📄 작업 내용

기존 준팍이 제안해주셨던 AOP 대신, 필터를 적용하여 구현하였습니다.
(AOP에 대한 학습 곡선보다는 필터를 빠르게 적용하는 것이 낫다고 판단했습니다.)

🙋🏻 주의 사항

다들 바쁜 시기인 만큼, 각 라인 별 이해를 돕기 위한 설명 남겨놓도록 하겠습니다.

스크린샷

📎 관련 이슈

#422

closed #422

레퍼런스

@github-actions
Copy link

github-actions bot commented Sep 18, 2023

Unit Test Results

  66 files    66 suites   21s ⏱️
278 tests 278 ✔️ 0 💤 0
289 runs  289 ✔️ 0 💤 0

Results for commit 83633fc.

♻️ This comment has been updated with latest results.

Copy link
Collaborator Author

@cpot5620 cpot5620 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드 리뷰하시기 편하시라고 약간의 설명 남겨두었습니다.

import org.springframework.web.context.annotation.RequestScope;

@Component
@RequestScope
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 Bean의 스코프를 위와 같이 설정함으로써, 생명 주기를 각 요청으로 설정하였습니다.

Comment on lines +16 to +23
@Override
public String inspect(String sql) {
if (isInRequestScope()) {
queryCounter.increase();
}

return sql;
}
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

StatementInspector에서 쿼리를 실행하기 전에, insepct 메서드를 호출합니다.

이때, 쿼리 카운트를 증가시킴으로써 쿼리 횟수를 확인할 수 있습니다.

Comment on lines +18 to +22
@Bean
public HibernatePropertiesCustomizer hibernatePropertiesCustomizer() {
return hibernateProperties ->
hibernateProperties.put(AvailableSettings.STATEMENT_INSPECTOR, queryInspector);
}
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hibernate에 쿼리 수 측정을 위한 QueryInspector를 등록하는 코드입니다.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

설명 굳굳~!

String requestURI = request.getRequestURI();

log.info("Latency : {}s, Query count : {}, Request URI : {}", latencyForSeconds, queryCount, requestURI);
MDC.clear();
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

임무를 마치고 복귀하는 쓰레드는 자신의 로컬 정보(?)를 삭제하지 않기 때문에 로깅 정보를 clear 해주어야 합니다.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

굳굳~!

long start = threadLocal.get();
long end = System.currentTimeMillis();

threadLocal.remove();
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

쓰레드 풀로 돌아가기 전에 remove를 통해, threadLocal에 저장된 값을 삭제해줍니다.

Copy link
Collaborator

@junpakPark junpakPark left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

쥬니 친절한 설명덕분에 코드를 이해하는 데 어려움이 없었습니당 ㅎㅎ
테스트도 있어서 더욱 든든하군요~ 👍👍👍

로직이나 코드 상 리뷰 남길 건 없구요
각 파일 맨 끝에 개행이 없는 것 같은데
해당 부분을 위한 Request Change 남기겠습니당 ㅎㅎ

Copy link
Collaborator

@yoondgu yoondgu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

상세한 설명 감사합니다 쥬니!! 수고 많으셨어용
approve 드리면서 의견 하나만 남길게요!

해당 로깅을 로컬 환경에서만 수행하도록 할 필요는 없을까요?
개발 서버에서는 계속 남겨도 될 로그라고 보시는지 궁금합니다!!

로컬 환경에서만 작동하도록 하는 방법 자체는 간단해보이는데, 팀원 분들의 의견에 따라 진행하면 될 것 같습니다.
참고 링크 에서 Command + f로 "profile" 찾으면 나오는 내용

void increase_Success() {
//given
QueryCounter queryCounter = new QueryCounter();
assertThat(queryCounter.getCount()).isZero();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isZero 간지나네요

queryCounter.increase();

//then
assertThat(queryCounter.getCount()).isOne();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isOne 도 간지나네요

Comment on lines +33 to +39
Thread thread = new Thread(latencyRecorder::start);
thread.start();
Thread.sleep(3000);

latencyRecorder.start();
Thread.sleep(3000);

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저 이 부분 이해가 안가보렷...

이렇게 하면 첫번째 thread.sleep 과 두번쨰 thread.sleep 은 다른 thread 에서 실행되는 것인가요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

모든 Thread에서 실행되는걸로 알아요..

테스트 의도는 새로 생성한 쓰레드에서는 6초를 기다렸고, 필드에 생성한 쓰레드는 3초만 기다렸다...
쓰레드 간의 독립성을 ,. 보여주고싶었어요

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이해완!

알러뷰

String requestURI = request.getRequestURI();

log.info("Latency : {}s, Query count : {}, Request URI : {}", latencyForSeconds, queryCount, requestURI);
MDC.clear();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

굳굳~!


threadLocal.remove();

return (double) (end - start) / 1000;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

return (end - start) / 1000d; 이렇게는 어떠신가용?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Half zero Success

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 무신 소리에요

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

반영 성공 ㄷㄷ

@kpeel5839
Copy link
Collaborator

조그만한 질문이랑 제안하나 드립니다~! 고생하셨어요~~~~

@kpeel5839
Copy link
Collaborator

상세한 설명 감사합니다 쥬니!! 수고 많으셨어용 approve 드리면서 의견 하나만 남길게요!

해당 로깅을 로컬 환경에서만 수행하도록 할 필요는 없을까요? 개발 서버에서는 계속 남겨도 될 로그라고 보시는지 궁금합니다!!

로컬 환경에서만 작동하도록 하는 방법 자체는 간단해보이는데, 팀원 분들의 의견에 따라 진행하면 될 것 같습니다. 참고 링크 에서 Command + f로 "profile" 찾으면 나오는 내용

그러면 LatencyLoggingFilter 위에 @Profile("로컬 프로필명") 만 추가하면 되려나요?

@yoondgu
Copy link
Collaborator

yoondgu commented Sep 19, 2023

상세한 설명 감사합니다 쥬니!! 수고 많으셨어용 approve 드리면서 의견 하나만 남길게요!
해당 로깅을 로컬 환경에서만 수행하도록 할 필요는 없을까요? 개발 서버에서는 계속 남겨도 될 로그라고 보시는지 궁금합니다!!
로컬 환경에서만 작동하도록 하는 방법 자체는 간단해보이는데, 팀원 분들의 의견에 따라 진행하면 될 것 같습니다. 참고 링크 에서 Command + f로 "profile" 찾으면 나오는 내용

그러면 LatencyLoggingFilter 위에 @Profile("로컬 프로필명") 만 추가하면 되려나요?

아 제가 공유드린 글은 경우가 조금 다르네요..!!
지금 코드 상황에서는 찾아보니깐 LatencyLoggingFilter에서 OncePerRequestFilter가 제공하는 메서드를 오버라이딩하면 적용할 수 있는 것 같아요.

( !로컬 프로필명.equals()로 해도 되지만 로컬 프로필명을 따로 정의하지 않아도 적용가능하게 하려면 이렇게 될 것 같아요)

    @Override
    protected boolean shouldNotFilter(HttpServletRequest request) {
        String activeProfile = System.getProperty("spring.profiles.active");
        return "dev".equals(activeProfile) || "prod".equals(activeProfile);
    }

@kpeel5839
Copy link
Collaborator

상세한 설명 감사합니다 쥬니!! 수고 많으셨어용 approve 드리면서 의견 하나만 남길게요!
해당 로깅을 로컬 환경에서만 수행하도록 할 필요는 없을까요? 개발 서버에서는 계속 남겨도 될 로그라고 보시는지 궁금합니다!!
로컬 환경에서만 작동하도록 하는 방법 자체는 간단해보이는데, 팀원 분들의 의견에 따라 진행하면 될 것 같습니다. 참고 링크 에서 Command + f로 "profile" 찾으면 나오는 내용

그러면 LatencyLoggingFilter 위에 @Profile("로컬 프로필명") 만 추가하면 되려나요?

아 제가 공유드린 글은 경우가 조금 다르네요..!! 지금 코드 상황에서는 찾아보니깐 LatencyLoggingFilter에서 OncePerRequestFilter가 제공하는 메서드를 오버라이딩하면 적용할 수 있는 것 같아요.

( !로컬 프로필명.equals()로 해도 되지만 로컬 프로필명을 따로 정의하지 않아도 적용가능하게 하려면 이렇게 될 것 같아요)

    @Override
    protected boolean shouldNotFilter(HttpServletRequest request) {
        String activeProfile = System.getProperty("spring.profiles.active");
        return "dev".equals(activeProfile) || "prod".equals(activeProfile);
    }

최고네요~!

@cpot5620
Copy link
Collaborator Author

준팍 및 매튜 코멘트 적용했습니다.

도이가 제안해주신 부분은 이야기 나누어보아야 할 것 같은데, 저는 개발 서버에서까지 로깅해야 좋을 것 같다는 생각이 들어요 !! (운영 서버는 조금 고민해봐야겠네용)
왜냐하면, 새로운 기능을 추가하게 되었을 때에도 매번 로컬에서만 테스트를 수행할 수는 없고, 놓치는 부분들이 생길 거라고 생각해요.
개발환경에서도 로깅하면, QA를 진행하면서 자연스럽게 알게되는 문제들도 확인할 수 있을 것 같아서요 !

@yoondgu
Copy link
Collaborator

yoondgu commented Sep 19, 2023

준팍 및 매튜 코멘트 적용했습니다.

도이가 제안해주신 부분은 이야기 나누어보아야 할 것 같은데, 저는 개발 서버에서까지 로깅해야 좋을 것 같다는 생각이 들어요 !! (운영 서버는 조금 고민해봐야겠네용)

왜냐하면, 새로운 기능을 추가하게 되었을 때에도 매번 로컬에서만 테스트를 수행할 수는 없고, 놓치는 부분들이 생길 거라고 생각해요.

개발환경에서도 로깅하면, QA를 진행하면서 자연스럽게 알게되는 문제들도 확인할 수 있을 것 같아서요 !

그러면 지금대로 진행해도 좋습니다 !! 👍👍

Copy link
Collaborator

@junpakPark junpakPark left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

EOF 해결하셨군용~
수고하셨습니다~

@cpot5620 cpot5620 merged commit d355eb6 into develop-BE Sep 19, 2023
3 checks passed
kpeel5839 added a commit that referenced this pull request Sep 21, 2023
* refactor : s3 패키지 추가로 인한 에러 Code 수정

* feat : s3 exception 추가

* refactor : image extension 추출 방식 수정

* refactor : S3Client 가 IOException 을 throw 할 수 있도록 작성

* style : 프린트, 주석 제거

* test : imageExtension Test 작성

* refactor : image 가 요청으로 들어오지 않는 경우를 고려해 로직 수정

* test : 이미지가 null 로 들어오는 경우 test 작성

* feat : 병합시에도 S3 Image Upload 가 가능하도록 구현

* refactor : 기본 이미지 URL 변경

* refactor : 기본 이미지의 처리를 TopicInfo -> Image 에서 할 수 있도록 수정

* refactor : 주석 앞에 TODO 추가

* refactor : fromImageFileName -> from 으로 메서드 명 변경

* refactor : getExtension -> findExtension 으로 변경

* refactor : S3 관련 Service 네이밍 수정

* [BE] Fix/#426 Token CORS 재설정 (#427)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* refactor : S3 관련 Service 네이밍 수정

* [BE] HotFix/#426 Refresh Token 중복 저장 방지 로직 수정 (#431)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: refreshToken 존재 시 삭제 로직 변경

* [BE] HotFix/#426 delete 메서드에 clearAutomatically 속성 적용 (#432)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: refreshToken 존재 시 삭제 로직 변경

* fix: delete 메서드에 clearAutomatically 속성 적용

* [BE] HotFix/#426 tokenService flush 추가 (#433)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: refreshToken 존재 시 삭제 로직 변경

* fix: delete 메서드에 clearAutomatically 속성 적용

* fix: delete 메서드에 clearAutomatically 속성 제거 및 flush 추가

* [BE] Refactor/#400 토픽 조회 시 업데이트 일시를 최근에 핀이 추가/변경된 일시로 변경 (#429)

* refactor: BaseEntity의 createdAt update 방지

* feat: Topic에 lastPinUpdatedAt 컬럼 추가, EntityListner 적용

- 기존 BaseEntity의 값들은 객체가 영속화될 때 저장된다.
- 이에 대해 일관성을 유지해야 한다. (핀 생성 일시, 핀 변경 일시 = 토픽의 최근 핀 변경 일시가 서로 같아야 하므로)
- 따라서 lastPinUpdatedAt 컬럼의 업데이트 또한 EntityListener 로 적용한다.

* feat: 토픽 조회 DTO의 updatedAt 값 lastPinUpdatedAt 으로 변경

* feat: 토픽 최신순 조회 로직 수정

- Topic에 lastPinUpdatedAt 추가로 인해 로직 수정 가능

* test: 토픽 조회 시 updatedAt 검증 테스트 추가

* chore: 로컬 테스트용 SQL에 테이블 컬럼 추가 변경 반영

* refactor: 토픽 Response Dto에 lastPinUpdatedAt 반영

* fix : 토큰 만료시간 및 redirect uri 수정

---------

Co-authored-by: jaeyeon kim <jakind@naver.com>

* [BE] Feature/#422 성능 측정을 위한 로깅 구현 (#434)

* feat: QueryCounter 객체 구현

* feat: QueryInspector 객체 구현

* feat: LatencyRecorder 객체 구현

* feat: LatencyLoggingFilter 객체 구현

* feat: LatencyRecorder Thread-safe 테스트 구현

* feat: HibernateConfig 구현

* test: 테스트 수정

* style: 개행 추가

* refactor: 수식 표현 방식 수정

* [BE] HotFix/#424 refresh token duplicated (#441)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: 디버깅을 위한 에러코드 추가

* [BE] HOTFix/#424 validateTokensForReissue 디버깅을 위한 에러코드 추가 (#443)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: 디버깅을 위한 에러코드 추가

* fix: validateTokensForReissue 디버깅을 위한 에러코드 추가

* fix: isExpired 임시 log 처리 (#444)

* Revert "fix: isExpired 임시 log 처리 (#444)"

This reverts commit 445f0dd.

* fix: cors Credentials 추가 (#458)

* [BE] Hotfix/cors allowHeaders 와일드카드 적용 (#462)

* fix: cors Credentials 추가

* fix: allowedHeaders 와일드카드 적용

* [BE] 부하테스트를 위한 Tomcat Log 추가 (#464)

* chore: yml 변수 적용 확인을 위한 debug 로그 추가

* chore: 톰캣 설정 기본값 추가

* chore: 톰캣 설정 기본값 추가

---------

Co-authored-by: yoondgu <doyoungwork@gmail.com>

* refactor : s3 패키지 추가로 인한 에러 Code 수정

* feat : s3 exception 추가

* refactor : image extension 추출 방식 수정

* refactor : S3Client 가 IOException 을 throw 할 수 있도록 작성

* style : 프린트, 주석 제거

* test : imageExtension Test 작성

* refactor : image 가 요청으로 들어오지 않는 경우를 고려해 로직 수정

* test : 이미지가 null 로 들어오는 경우 test 작성

* feat : 병합시에도 S3 Image Upload 가 가능하도록 구현

* refactor : 기본 이미지 URL 변경

* refactor : 기본 이미지의 처리를 TopicInfo -> Image 에서 할 수 있도록 수정

* refactor : 주석 앞에 TODO 추가

* refactor : fromImageFileName -> from 으로 메서드 명 변경

* refactor : getExtension -> findExtension 으로 변경

* refactor : S3 관련 Service 네이밍 수정

* refactor : S3 관련 Service 네이밍 수정

* refactor : topic, image errorCode 수정

* refactor : Exception 부분 네이밍 S3 -> Image 로 변경

* refactor : findExtension -> extractExtensio 으로 메서드 네이밍 변경

* refactor : 부정 조건문 제거

* refactor : Illegal Image File Extension 에러 메세지 수정

* refactor : action method consume type 순서 조정

---------

Co-authored-by: 준팍(junpak) <112045553+junpakPark@users.noreply.github.com>
Co-authored-by: Doy <doyoungwork@gmail.com>
Co-authored-by: zun <50602742+cpot5620@users.noreply.github.com>
jiwonh423 pushed a commit that referenced this pull request Sep 21, 2023
* [BE] Fix/#366 테스트 수행 시 로그 패턴 깨지는 오류 해결 (#367)

* fix: 테스트 로그 패턴 설정 오류 수정

- 잘못된 로그 패턴 설정으로 인한 'LOG_PATTERN IS_UNDEFINED' 메시지 출력 오류 수정

* chore: 프론트엔드, 백엔드 develop 분리에 따른 워크플로우 수정

* fix: 테스트 로그 설정 파일명 변경
- springProperty 지원을 위해 파일명 변경

* feat: 로그 내용 및 설정 보완(색상 적용)

- 로그에서 로거, 레벨, PID 확인 가능하도록 내용 보완
- 테스트 로그의 경우 프로젝트 패키지에 해당하는 로그만 DEBUG 레벨로 설정
- 콘솔 로그 색상 적용

* feat: 로그 내용 보완 - 스레드 출력하도록 수정

* refactor: DataBaseCleanup JdbcTemplate 적용 (#371)

* [BE] Refactor/#376 로깅 환경 개선을 위한 설정 파일 리팩터링 (#377)

* refactor: 로깅 전략 보완에 따른 설정 파일 수정

- 운영 환경 별 로그 종류(콘솔, 파일), 레벨 변경 (PR 첨부 설명 참조)
- logback-spring.xml 에서 Appender 분리
- application-*.xml 에서 로그 패턴 값 삭제

* chore: 에러 로그 슬랙 알림을 위한 의존성 추가, 관련 주석 작성

* remove: 테스트 설정 파일에 불필요한 로그 설정 삭제

* style: 불필요한 빈 줄 삭제

* chore: 콘솔 파일 로그 설정 삭제로 인한 불필요한 설정 삭제

* chore: 로그 파일 롤링 용량 설정 모든 레벨 통일

* [BE] Chore/#372 submodule 적용 (#375)

* chore: submodule 적용

Co-authored-by: jaeyeon kim <jakind@naver.com>

* chore: workflow access token 적용

Co-authored-by: jaeyeon kim <jakind@naver.com>

---------

Co-authored-by: jaeyeon kim <jakind@naver.com>
Co-authored-by: yoondgu <doyou2ing@naver.com>

* feat: 운영 서버 500 에러 슬랙 알림 적용, 로컬 환경변수 서브모듈에 저장 (#379)

* hotfix: yml 문법으로 인한 오류 수정 (#381)

* fix: 워크플로우 서브모듈 문제 해결 (#384)

* chore: 워크플로우 서브모듈 문제 해결 확인을 위한 push (#385)

* Feat/#386 image (#391)

* chore : S3 의존성 추가

* feat : Amazon S3 Component 추가

* feat : S3 에 업로드 될 Image 의 이름을 설정해주는 ImageName 과 UploadFile 추가

* feat : S3 에 업로드 될 Image 의 이름을 설정해주는 ImageNae 과 UploadFile 추가

* feat : 파일을 업로드하고 해당하는 URL 을 반환하는 Service 구현

* chore : s3 환경 설정 추가

* feat : String image -> MultipartFile image 로 변경

* feat : @RequestPart 적용 및 S3 upload 로직 추가

* chore : Test 시 Profile 설정

* test : 테스트 시 S3 에 접근하지 않도록 하기 위해 Profile 별로 S3Service Bean 구분

* test : 추가된 Image 저장 기능에 맞춰 일부 Test 수정

* chore : S3, CloudFront 환경설정 적용

* test : RestDocs 수정중

* refactor : S3 Bean 추가 (#396)

* [BE] Refactor/#390 지도 및 핀 상세 조회 API에 수정 권한 여부 필드 추가 (#392)

* feat: 토픽 상세 조회 내용에 수정 권한 추가

* refactor: 토픽 상세 조회 DTO 정적 팩터리 메서드명 수정

* feat: 핀 상세 조회 내용에 수정 권한 추가

* fix: 토픽 RestDocs 깨지는 문제 수정, API 목차 순서 조정

- 목록 조회 API 기준으로 순서 조정, API 네이밍 보완

* refactor: 토픽, 핀 수정 권한 여부 필드명 직관적으로 수정

- hasUpdatePermission -> canUpdate

* refactor: Guest 전용 토픽 상세조회 DTO 정적 팩터리 메서드 정의

* refactor: 메서드 순서 정리, Guest 전용 토픽 조회 DTO 정적 팩터리 메서드 정의

* refactor: Guest 전용 토픽 List 조회 DTO 정적 팩터리 메서드 정의

* refactor: Info, Debug 레벨 커스텀 로그만 출력하도록 변경 (#397)

* feat : pin 생성시 image upload 기능 추가 (#401)

* [BE] Feat/#378 Admin API 구현 (#405)

* feat: 전체 회원 조회 기능 구현

* feat: 회원 삭제(탈퇴) 기능 구현

* feat: 회원 삭제(탈퇴)시 Pin/Topic Soft-deleting 구현

* refactor: Admin DTO 분리

* feat: Member 상세 정보 조회 기능 구현

* feat: Topic 삭제 및 이미지 삭제 기능 구현

* feat: Pin 삭제 및 이미지 삭제 기능 구현

* feat: Admin API 구현

* refactor: Member 상태(차단, 탈퇴 등) 필드에 따른 로그인 로직 수정

* refactor: @SqlDelete 삭제 및 JPQL 대체

* feat: AdminInterceptor 구현

* test: Repository soft-deleting 테스트 구현

* test: AdminQueryService 테스트 구현

* test: AdminCommandService 테스트 구현

* test: AdminController Restdocs 테스트 구현

* test: AdminInterceptor Mocking

* test: 통합 테스트 구현

* refactor: 오탈자 수정

* refactor: Auth 관련 예외 클래스 추가

* refactor: 불필요한 메서드 제거

* refactor: findMemberById 예외 수정

* test: GithubActions 실패 테스트 수정

* refactor: isAdmin() 메서드 추가

* refactor: 회원 삭제(탈퇴)시, 추가 정보(즐겨찾기 등) 삭제

* Revert "[BE] Feat/#378 Admin API 구현 (#405)" (#414)

This reverts commit 4722faa.

* [BE] Feat/#378 Admin API 구현 (#415)

* feat: 전체 회원 조회 기능 구현

* feat: 회원 삭제(탈퇴) 기능 구현

* feat: 회원 삭제(탈퇴)시 Pin/Topic Soft-deleting 구현

* refactor: Admin DTO 분리

* feat: Member 상세 정보 조회 기능 구현

* feat: Topic 삭제 및 이미지 삭제 기능 구현

* feat: Pin 삭제 및 이미지 삭제 기능 구현

* feat: Admin API 구현

* refactor: Member 상태(차단, 탈퇴 등) 필드에 따른 로그인 로직 수정

* refactor: @SqlDelete 삭제 및 JPQL 대체

* feat: AdminInterceptor 구현

* test: Repository soft-deleting 테스트 구현

* test: AdminQueryService 테스트 구현

* test: AdminCommandService 테스트 구현

* test: AdminController Restdocs 테스트 구현

* test: AdminInterceptor Mocking

* test: 통합 테스트 구현

* refactor: 오탈자 수정

* refactor: Auth 관련 예외 클래스 추가

* refactor: 불필요한 메서드 제거

* refactor: findMemberById 예외 수정

* test: GithubActions 실패 테스트 수정

* refactor: isAdmin() 메서드 추가

* refactor: 회원 삭제(탈퇴)시, 추가 정보(즐겨찾기 등) 삭제

* refactor: Member status 기본값 설정

* remove: Member status 기본값 설정 삭제

* [BE] Feature/#399 내 정보(회원 닉네임) 수정 API 구현 (#408)

* refactor: 사용하지 않는 MemberRepository 메서드 삭제

* refactor: 회원 업데이트 부분 변경으로 시그니처 변경

- 현재 회원 update에서 변경되는 부분만 인자로 남겨둠
- update 시, Member 에서 MemberInfo.getXX을 하는 대신 MemberInfo에서 부분 변경된 객체를 새로 반환하도록 수정

* feat: 회원 정보 수정 API 구현 및 테스트 작성

* test: JwtTokenProviderTest 작성

- 로컬에서 Postman 테스트 시 이 테스트를 사용하면 쉽게 토큰 발급 후 활용 가능

* chore: 로컬 환경용 더미데이터 sql 작성

* chore: 로컬 환경 data.sql을 위한 서브모듈 변경

* docs: 기능 명세서 및 테스트 코드 용어 정리 (유저, 멤버 -> 회원)

* chore: 로그 환경설정 파일 디렉터리 분리

* feat: 닉네임 중복 검증 구현

* refactor: 회원의 이메일 Unique 제약조건 삭제

- 닉네임, OauthId로 회원을 식별할 수 있다.
- 같은 이메일로 네이버, 카카오에 가입한 사람이 소셜 로그인으로 두 계정을 만들 경우, 동일한 이메일이 저장될 수도 있다.

* refactor: 모호한 메서드명 수정

* refactor: Email이 Unique하지 않음에 따라 테스트에서 사용하는 조회 쿼리 변경

- findByEmail 대신 findById
- 기본키가 아닌 유일키로 조회하는 건 테이블 구조 변경 여지가 있으므로 findById 사용

* refactor: 내 정보 수정 API URI 변경

* fix: 디렉터리 분리에 따른 로그 설정 파일 appender 경로 수정

* [BE] Refactor/#406 토픽 권한을 가진 회원 목록 조회 시 공개 여부를 함께 반환하도록 변경  (#412)

* refactor: 사용하지 않는 MemberRepository 메서드 삭제

* refactor: 회원 업데이트 부분 변경으로 시그니처 변경

- 현재 회원 update에서 변경되는 부분만 인자로 남겨둠
- update 시, Member 에서 MemberInfo.getXX을 하는 대신 MemberInfo에서 부분 변경된 객체를 새로 반환하도록 수정

* feat: 회원 정보 수정 API 구현 및 테스트 작성

* test: JwtTokenProviderTest 작성

- 로컬에서 Postman 테스트 시 이 테스트를 사용하면 쉽게 토큰 발급 후 활용 가능

* chore: 로컬 환경용 더미데이터 sql 작성

* chore: 로컬 환경 data.sql을 위한 서브모듈 변경

* docs: 기능 명세서 및 테스트 코드 용어 정리 (유저, 멤버 -> 회원)

* chore: 로그 환경설정 파일 디렉터리 분리

* feat: 닉네임 중복 검증 구현

* refactor: 회원의 이메일 Unique 제약조건 삭제

- 닉네임, OauthId로 회원을 식별할 수 있다.
- 같은 이메일로 네이버, 카카오에 가입한 사람이 소셜 로그인으로 두 계정을 만들 경우, 동일한 이메일이 저장될 수도 있다.

* refactor: 모호한 메서드명 수정

* refactor: Email이 Unique하지 않음에 따라 테스트에서 사용하는 조회 쿼리 변경

- findByEmail 대신 findById
- 기본키가 아닌 유일키로 조회하는 건 테이블 구조 변경 여지가 있으므로 findById 사용

* refactor: 내 정보 수정 API URI 변경

* refactor: 토픽 권한 회원 목록 조회 API를 접근 정보(권한 회원 목록 및 공개 여부) 조회로 명세 변경

- 관련 검토가 필요한 API 설계 및 구현 내용에 대한 TODO 주석 작성

* fix: 디렉터리 분리에 따른 로그 설정 파일 appender 경로 수정

* fix: 디렉터리 분리에 따른 로그 설정 파일 appender 경로 수정

* refactor: 실수로 바꾼 기존 메서드명 원복

* refactor: 불필요한 import문 제거

* refactor: 불필요한 접근제어자, 중복 코드 제거

* docs: Restdocs API 네이밍 반영

* fix: 내 정보 수정 RestDocs 스니펫 누락 추가

* [BE] Feature/#388 refresh token 및 로그아웃 기능 구현 (#411)

* chore: redis 의존성 추가

* refactor: OauthService 필드에 final 추가

* feat: refreshToken 엔티티 및 레포지토리 구현

* feat: JwtTokenProvider RefreshToken 발급 구현

* feat: 로그인 시 RefreshToken 발급 기능 구현

* feat: Auth 패키지 커스텀 예외 추가

* refactor: validate 메서드 리팩터링

* chore: refreshToken 만료 시간 추가

* test: Test를 위한 설정 변경

* feat: 액세스 토큰 재발급 및 로그아웃 기능 구현

* chore: Redis 의존성 제거

* test: TestTokenProvider 객체 구현

* refactor: /logout HttpMethod 변경, cookie 관련 cors설정 및 maxAge 설정,

* test: DisplayName 추가

* feat: RTR 적용 및 OauthConntroller 제거, OauthService 및 TokenService 역할과 책임 재분배

* refactor : 피드백 반영

* refactor : 매직넘버 상수화

* refactor : 네이밍 수정

* feat: 쿠키 설정 추가

* [BE] Fix/#424 refresh token duplicated (#425)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* [BE] Fix/#426 Token CORS 재설정 (#427)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* [BE] HotFix/#426 Refresh Token 중복 저장 방지 로직 수정 (#431)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: refreshToken 존재 시 삭제 로직 변경

* [BE] HotFix/#426 delete 메서드에 clearAutomatically 속성 적용 (#432)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: refreshToken 존재 시 삭제 로직 변경

* fix: delete 메서드에 clearAutomatically 속성 적용

* [BE] HotFix/#426 tokenService flush 추가 (#433)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: refreshToken 존재 시 삭제 로직 변경

* fix: delete 메서드에 clearAutomatically 속성 적용

* fix: delete 메서드에 clearAutomatically 속성 제거 및 flush 추가

* [BE] Refactor/#400 토픽 조회 시 업데이트 일시를 최근에 핀이 추가/변경된 일시로 변경 (#429)

* refactor: BaseEntity의 createdAt update 방지

* feat: Topic에 lastPinUpdatedAt 컬럼 추가, EntityListner 적용

- 기존 BaseEntity의 값들은 객체가 영속화될 때 저장된다.
- 이에 대해 일관성을 유지해야 한다. (핀 생성 일시, 핀 변경 일시 = 토픽의 최근 핀 변경 일시가 서로 같아야 하므로)
- 따라서 lastPinUpdatedAt 컬럼의 업데이트 또한 EntityListener 로 적용한다.

* feat: 토픽 조회 DTO의 updatedAt 값 lastPinUpdatedAt 으로 변경

* feat: 토픽 최신순 조회 로직 수정

- Topic에 lastPinUpdatedAt 추가로 인해 로직 수정 가능

* test: 토픽 조회 시 updatedAt 검증 테스트 추가

* chore: 로컬 테스트용 SQL에 테이블 컬럼 추가 변경 반영

* refactor: 토픽 Response Dto에 lastPinUpdatedAt 반영

* fix : 토큰 만료시간 및 redirect uri 수정

---------

Co-authored-by: jaeyeon kim <jakind@naver.com>

* [BE] Feature/#422 성능 측정을 위한 로깅 구현 (#434)

* feat: QueryCounter 객체 구현

* feat: QueryInspector 객체 구현

* feat: LatencyRecorder 객체 구현

* feat: LatencyLoggingFilter 객체 구현

* feat: LatencyRecorder Thread-safe 테스트 구현

* feat: HibernateConfig 구현

* test: 테스트 수정

* style: 개행 추가

* refactor: 수식 표현 방식 수정

* [BE] HotFix/#424 refresh token duplicated (#441)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: 디버깅을 위한 에러코드 추가

* [BE] HOTFix/#424 validateTokensForReissue 디버깅을 위한 에러코드 추가 (#443)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: 디버깅을 위한 에러코드 추가

* fix: validateTokensForReissue 디버깅을 위한 에러코드 추가

* fix: isExpired 임시 log 처리 (#444)

* Revert "fix: isExpired 임시 log 처리 (#444)"

This reverts commit 445f0dd.

* fix: cors Credentials 추가 (#458)

* [BE] Hotfix/cors allowHeaders 와일드카드 적용 (#462)

* fix: cors Credentials 추가

* fix: allowedHeaders 와일드카드 적용

* [BE] 부하테스트를 위한 Tomcat Log 추가 (#464)

* chore: yml 변수 적용 확인을 위한 debug 로그 추가

* chore: 톰캣 설정 기본값 추가

* chore: 톰캣 설정 기본값 추가

---------

Co-authored-by: yoondgu <doyoungwork@gmail.com>

* [BE] S3 를 통한 Image Upload 기능 구현 (#428)

* refactor : s3 패키지 추가로 인한 에러 Code 수정

* feat : s3 exception 추가

* refactor : image extension 추출 방식 수정

* refactor : S3Client 가 IOException 을 throw 할 수 있도록 작성

* style : 프린트, 주석 제거

* test : imageExtension Test 작성

* refactor : image 가 요청으로 들어오지 않는 경우를 고려해 로직 수정

* test : 이미지가 null 로 들어오는 경우 test 작성

* feat : 병합시에도 S3 Image Upload 가 가능하도록 구현

* refactor : 기본 이미지 URL 변경

* refactor : 기본 이미지의 처리를 TopicInfo -> Image 에서 할 수 있도록 수정

* refactor : 주석 앞에 TODO 추가

* refactor : fromImageFileName -> from 으로 메서드 명 변경

* refactor : getExtension -> findExtension 으로 변경

* refactor : S3 관련 Service 네이밍 수정

* [BE] Fix/#426 Token CORS 재설정 (#427)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* refactor : S3 관련 Service 네이밍 수정

* [BE] HotFix/#426 Refresh Token 중복 저장 방지 로직 수정 (#431)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: refreshToken 존재 시 삭제 로직 변경

* [BE] HotFix/#426 delete 메서드에 clearAutomatically 속성 적용 (#432)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: refreshToken 존재 시 삭제 로직 변경

* fix: delete 메서드에 clearAutomatically 속성 적용

* [BE] HotFix/#426 tokenService flush 추가 (#433)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: refreshToken 존재 시 삭제 로직 변경

* fix: delete 메서드에 clearAutomatically 속성 적용

* fix: delete 메서드에 clearAutomatically 속성 제거 및 flush 추가

* [BE] Refactor/#400 토픽 조회 시 업데이트 일시를 최근에 핀이 추가/변경된 일시로 변경 (#429)

* refactor: BaseEntity의 createdAt update 방지

* feat: Topic에 lastPinUpdatedAt 컬럼 추가, EntityListner 적용

- 기존 BaseEntity의 값들은 객체가 영속화될 때 저장된다.
- 이에 대해 일관성을 유지해야 한다. (핀 생성 일시, 핀 변경 일시 = 토픽의 최근 핀 변경 일시가 서로 같아야 하므로)
- 따라서 lastPinUpdatedAt 컬럼의 업데이트 또한 EntityListener 로 적용한다.

* feat: 토픽 조회 DTO의 updatedAt 값 lastPinUpdatedAt 으로 변경

* feat: 토픽 최신순 조회 로직 수정

- Topic에 lastPinUpdatedAt 추가로 인해 로직 수정 가능

* test: 토픽 조회 시 updatedAt 검증 테스트 추가

* chore: 로컬 테스트용 SQL에 테이블 컬럼 추가 변경 반영

* refactor: 토픽 Response Dto에 lastPinUpdatedAt 반영

* fix : 토큰 만료시간 및 redirect uri 수정

---------

Co-authored-by: jaeyeon kim <jakind@naver.com>

* [BE] Feature/#422 성능 측정을 위한 로깅 구현 (#434)

* feat: QueryCounter 객체 구현

* feat: QueryInspector 객체 구현

* feat: LatencyRecorder 객체 구현

* feat: LatencyLoggingFilter 객체 구현

* feat: LatencyRecorder Thread-safe 테스트 구현

* feat: HibernateConfig 구현

* test: 테스트 수정

* style: 개행 추가

* refactor: 수식 표현 방식 수정

* [BE] HotFix/#424 refresh token duplicated (#441)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: 디버깅을 위한 에러코드 추가

* [BE] HOTFix/#424 validateTokensForReissue 디버깅을 위한 에러코드 추가 (#443)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: 디버깅을 위한 에러코드 추가

* fix: validateTokensForReissue 디버깅을 위한 에러코드 추가

* fix: isExpired 임시 log 처리 (#444)

* Revert "fix: isExpired 임시 log 처리 (#444)"

This reverts commit 445f0dd.

* fix: cors Credentials 추가 (#458)

* [BE] Hotfix/cors allowHeaders 와일드카드 적용 (#462)

* fix: cors Credentials 추가

* fix: allowedHeaders 와일드카드 적용

* [BE] 부하테스트를 위한 Tomcat Log 추가 (#464)

* chore: yml 변수 적용 확인을 위한 debug 로그 추가

* chore: 톰캣 설정 기본값 추가

* chore: 톰캣 설정 기본값 추가

---------

Co-authored-by: yoondgu <doyoungwork@gmail.com>

* refactor : s3 패키지 추가로 인한 에러 Code 수정

* feat : s3 exception 추가

* refactor : image extension 추출 방식 수정

* refactor : S3Client 가 IOException 을 throw 할 수 있도록 작성

* style : 프린트, 주석 제거

* test : imageExtension Test 작성

* refactor : image 가 요청으로 들어오지 않는 경우를 고려해 로직 수정

* test : 이미지가 null 로 들어오는 경우 test 작성

* feat : 병합시에도 S3 Image Upload 가 가능하도록 구현

* refactor : 기본 이미지 URL 변경

* refactor : 기본 이미지의 처리를 TopicInfo -> Image 에서 할 수 있도록 수정

* refactor : 주석 앞에 TODO 추가

* refactor : fromImageFileName -> from 으로 메서드 명 변경

* refactor : getExtension -> findExtension 으로 변경

* refactor : S3 관련 Service 네이밍 수정

* refactor : S3 관련 Service 네이밍 수정

* refactor : topic, image errorCode 수정

* refactor : Exception 부분 네이밍 S3 -> Image 로 변경

* refactor : findExtension -> extractExtensio 으로 메서드 네이밍 변경

* refactor : 부정 조건문 제거

* refactor : Illegal Image File Extension 에러 메세지 수정

* refactor : action method consume type 순서 조정

---------

Co-authored-by: 준팍(junpak) <112045553+junpakPark@users.noreply.github.com>
Co-authored-by: Doy <doyoungwork@gmail.com>
Co-authored-by: zun <50602742+cpot5620@users.noreply.github.com>

---------

Co-authored-by: Doy <doyoungwork@gmail.com>
Co-authored-by: 준팍(junpak) <112045553+junpakPark@users.noreply.github.com>
Co-authored-by: jaeyeon kim <jakind@naver.com>
Co-authored-by: yoondgu <doyou2ing@naver.com>
Co-authored-by: kpeel5839 <89840550+kpeel5839@users.noreply.github.com>
kpeel5839 added a commit that referenced this pull request Sep 21, 2023
* [BE] Fix/#366 테스트 수행 시 로그 패턴 깨지는 오류 해결 (#367)

* fix: 테스트 로그 패턴 설정 오류 수정

- 잘못된 로그 패턴 설정으로 인한 'LOG_PATTERN IS_UNDEFINED' 메시지 출력 오류 수정

* chore: 프론트엔드, 백엔드 develop 분리에 따른 워크플로우 수정

* fix: 테스트 로그 설정 파일명 변경
- springProperty 지원을 위해 파일명 변경

* feat: 로그 내용 및 설정 보완(색상 적용)

- 로그에서 로거, 레벨, PID 확인 가능하도록 내용 보완
- 테스트 로그의 경우 프로젝트 패키지에 해당하는 로그만 DEBUG 레벨로 설정
- 콘솔 로그 색상 적용

* feat: 로그 내용 보완 - 스레드 출력하도록 수정

* refactor: DataBaseCleanup JdbcTemplate 적용 (#371)

* [BE] Refactor/#376 로깅 환경 개선을 위한 설정 파일 리팩터링 (#377)

* refactor: 로깅 전략 보완에 따른 설정 파일 수정

- 운영 환경 별 로그 종류(콘솔, 파일), 레벨 변경 (PR 첨부 설명 참조)
- logback-spring.xml 에서 Appender 분리
- application-*.xml 에서 로그 패턴 값 삭제

* chore: 에러 로그 슬랙 알림을 위한 의존성 추가, 관련 주석 작성

* remove: 테스트 설정 파일에 불필요한 로그 설정 삭제

* style: 불필요한 빈 줄 삭제

* chore: 콘솔 파일 로그 설정 삭제로 인한 불필요한 설정 삭제

* chore: 로그 파일 롤링 용량 설정 모든 레벨 통일

* [BE] Chore/#372 submodule 적용 (#375)

* chore: submodule 적용

Co-authored-by: jaeyeon kim <jakind@naver.com>

* chore: workflow access token 적용

Co-authored-by: jaeyeon kim <jakind@naver.com>

---------

Co-authored-by: jaeyeon kim <jakind@naver.com>
Co-authored-by: yoondgu <doyou2ing@naver.com>

* feat: 운영 서버 500 에러 슬랙 알림 적용, 로컬 환경변수 서브모듈에 저장 (#379)

* hotfix: yml 문법으로 인한 오류 수정 (#381)

* fix: 워크플로우 서브모듈 문제 해결 (#384)

* chore: 워크플로우 서브모듈 문제 해결 확인을 위한 push (#385)

* Feat/#386 image (#391)

* chore : S3 의존성 추가

* feat : Amazon S3 Component 추가

* feat : S3 에 업로드 될 Image 의 이름을 설정해주는 ImageName 과 UploadFile 추가

* feat : S3 에 업로드 될 Image 의 이름을 설정해주는 ImageNae 과 UploadFile 추가

* feat : 파일을 업로드하고 해당하는 URL 을 반환하는 Service 구현

* chore : s3 환경 설정 추가

* feat : String image -> MultipartFile image 로 변경

* feat : @RequestPart 적용 및 S3 upload 로직 추가

* chore : Test 시 Profile 설정

* test : 테스트 시 S3 에 접근하지 않도록 하기 위해 Profile 별로 S3Service Bean 구분

* test : 추가된 Image 저장 기능에 맞춰 일부 Test 수정

* chore : S3, CloudFront 환경설정 적용

* test : RestDocs 수정중

* refactor : S3 Bean 추가 (#396)

* [BE] Refactor/#390 지도 및 핀 상세 조회 API에 수정 권한 여부 필드 추가 (#392)

* feat: 토픽 상세 조회 내용에 수정 권한 추가

* refactor: 토픽 상세 조회 DTO 정적 팩터리 메서드명 수정

* feat: 핀 상세 조회 내용에 수정 권한 추가

* fix: 토픽 RestDocs 깨지는 문제 수정, API 목차 순서 조정

- 목록 조회 API 기준으로 순서 조정, API 네이밍 보완

* refactor: 토픽, 핀 수정 권한 여부 필드명 직관적으로 수정

- hasUpdatePermission -> canUpdate

* refactor: Guest 전용 토픽 상세조회 DTO 정적 팩터리 메서드 정의

* refactor: 메서드 순서 정리, Guest 전용 토픽 조회 DTO 정적 팩터리 메서드 정의

* refactor: Guest 전용 토픽 List 조회 DTO 정적 팩터리 메서드 정의

* refactor: Info, Debug 레벨 커스텀 로그만 출력하도록 변경 (#397)

* feat : pin 생성시 image upload 기능 추가 (#401)

* [BE] Feat/#378 Admin API 구현 (#405)

* feat: 전체 회원 조회 기능 구현

* feat: 회원 삭제(탈퇴) 기능 구현

* feat: 회원 삭제(탈퇴)시 Pin/Topic Soft-deleting 구현

* refactor: Admin DTO 분리

* feat: Member 상세 정보 조회 기능 구현

* feat: Topic 삭제 및 이미지 삭제 기능 구현

* feat: Pin 삭제 및 이미지 삭제 기능 구현

* feat: Admin API 구현

* refactor: Member 상태(차단, 탈퇴 등) 필드에 따른 로그인 로직 수정

* refactor: @SqlDelete 삭제 및 JPQL 대체

* feat: AdminInterceptor 구현

* test: Repository soft-deleting 테스트 구현

* test: AdminQueryService 테스트 구현

* test: AdminCommandService 테스트 구현

* test: AdminController Restdocs 테스트 구현

* test: AdminInterceptor Mocking

* test: 통합 테스트 구현

* refactor: 오탈자 수정

* refactor: Auth 관련 예외 클래스 추가

* refactor: 불필요한 메서드 제거

* refactor: findMemberById 예외 수정

* test: GithubActions 실패 테스트 수정

* refactor: isAdmin() 메서드 추가

* refactor: 회원 삭제(탈퇴)시, 추가 정보(즐겨찾기 등) 삭제

* Revert "[BE] Feat/#378 Admin API 구현 (#405)" (#414)

This reverts commit 4722faa.

* [BE] Feat/#378 Admin API 구현 (#415)

* feat: 전체 회원 조회 기능 구현

* feat: 회원 삭제(탈퇴) 기능 구현

* feat: 회원 삭제(탈퇴)시 Pin/Topic Soft-deleting 구현

* refactor: Admin DTO 분리

* feat: Member 상세 정보 조회 기능 구현

* feat: Topic 삭제 및 이미지 삭제 기능 구현

* feat: Pin 삭제 및 이미지 삭제 기능 구현

* feat: Admin API 구현

* refactor: Member 상태(차단, 탈퇴 등) 필드에 따른 로그인 로직 수정

* refactor: @SqlDelete 삭제 및 JPQL 대체

* feat: AdminInterceptor 구현

* test: Repository soft-deleting 테스트 구현

* test: AdminQueryService 테스트 구현

* test: AdminCommandService 테스트 구현

* test: AdminController Restdocs 테스트 구현

* test: AdminInterceptor Mocking

* test: 통합 테스트 구현

* refactor: 오탈자 수정

* refactor: Auth 관련 예외 클래스 추가

* refactor: 불필요한 메서드 제거

* refactor: findMemberById 예외 수정

* test: GithubActions 실패 테스트 수정

* refactor: isAdmin() 메서드 추가

* refactor: 회원 삭제(탈퇴)시, 추가 정보(즐겨찾기 등) 삭제

* refactor: Member status 기본값 설정

* remove: Member status 기본값 설정 삭제

* [BE] Feature/#399 내 정보(회원 닉네임) 수정 API 구현 (#408)

* refactor: 사용하지 않는 MemberRepository 메서드 삭제

* refactor: 회원 업데이트 부분 변경으로 시그니처 변경

- 현재 회원 update에서 변경되는 부분만 인자로 남겨둠
- update 시, Member 에서 MemberInfo.getXX을 하는 대신 MemberInfo에서 부분 변경된 객체를 새로 반환하도록 수정

* feat: 회원 정보 수정 API 구현 및 테스트 작성

* test: JwtTokenProviderTest 작성

- 로컬에서 Postman 테스트 시 이 테스트를 사용하면 쉽게 토큰 발급 후 활용 가능

* chore: 로컬 환경용 더미데이터 sql 작성

* chore: 로컬 환경 data.sql을 위한 서브모듈 변경

* docs: 기능 명세서 및 테스트 코드 용어 정리 (유저, 멤버 -> 회원)

* chore: 로그 환경설정 파일 디렉터리 분리

* feat: 닉네임 중복 검증 구현

* refactor: 회원의 이메일 Unique 제약조건 삭제

- 닉네임, OauthId로 회원을 식별할 수 있다.
- 같은 이메일로 네이버, 카카오에 가입한 사람이 소셜 로그인으로 두 계정을 만들 경우, 동일한 이메일이 저장될 수도 있다.

* refactor: 모호한 메서드명 수정

* refactor: Email이 Unique하지 않음에 따라 테스트에서 사용하는 조회 쿼리 변경

- findByEmail 대신 findById
- 기본키가 아닌 유일키로 조회하는 건 테이블 구조 변경 여지가 있으므로 findById 사용

* refactor: 내 정보 수정 API URI 변경

* fix: 디렉터리 분리에 따른 로그 설정 파일 appender 경로 수정

* [BE] Refactor/#406 토픽 권한을 가진 회원 목록 조회 시 공개 여부를 함께 반환하도록 변경  (#412)

* refactor: 사용하지 않는 MemberRepository 메서드 삭제

* refactor: 회원 업데이트 부분 변경으로 시그니처 변경

- 현재 회원 update에서 변경되는 부분만 인자로 남겨둠
- update 시, Member 에서 MemberInfo.getXX을 하는 대신 MemberInfo에서 부분 변경된 객체를 새로 반환하도록 수정

* feat: 회원 정보 수정 API 구현 및 테스트 작성

* test: JwtTokenProviderTest 작성

- 로컬에서 Postman 테스트 시 이 테스트를 사용하면 쉽게 토큰 발급 후 활용 가능

* chore: 로컬 환경용 더미데이터 sql 작성

* chore: 로컬 환경 data.sql을 위한 서브모듈 변경

* docs: 기능 명세서 및 테스트 코드 용어 정리 (유저, 멤버 -> 회원)

* chore: 로그 환경설정 파일 디렉터리 분리

* feat: 닉네임 중복 검증 구현

* refactor: 회원의 이메일 Unique 제약조건 삭제

- 닉네임, OauthId로 회원을 식별할 수 있다.
- 같은 이메일로 네이버, 카카오에 가입한 사람이 소셜 로그인으로 두 계정을 만들 경우, 동일한 이메일이 저장될 수도 있다.

* refactor: 모호한 메서드명 수정

* refactor: Email이 Unique하지 않음에 따라 테스트에서 사용하는 조회 쿼리 변경

- findByEmail 대신 findById
- 기본키가 아닌 유일키로 조회하는 건 테이블 구조 변경 여지가 있으므로 findById 사용

* refactor: 내 정보 수정 API URI 변경

* refactor: 토픽 권한 회원 목록 조회 API를 접근 정보(권한 회원 목록 및 공개 여부) 조회로 명세 변경

- 관련 검토가 필요한 API 설계 및 구현 내용에 대한 TODO 주석 작성

* fix: 디렉터리 분리에 따른 로그 설정 파일 appender 경로 수정

* fix: 디렉터리 분리에 따른 로그 설정 파일 appender 경로 수정

* refactor: 실수로 바꾼 기존 메서드명 원복

* refactor: 불필요한 import문 제거

* refactor: 불필요한 접근제어자, 중복 코드 제거

* docs: Restdocs API 네이밍 반영

* fix: 내 정보 수정 RestDocs 스니펫 누락 추가

* [BE] Feature/#388 refresh token 및 로그아웃 기능 구현 (#411)

* chore: redis 의존성 추가

* refactor: OauthService 필드에 final 추가

* feat: refreshToken 엔티티 및 레포지토리 구현

* feat: JwtTokenProvider RefreshToken 발급 구현

* feat: 로그인 시 RefreshToken 발급 기능 구현

* feat: Auth 패키지 커스텀 예외 추가

* refactor: validate 메서드 리팩터링

* chore: refreshToken 만료 시간 추가

* test: Test를 위한 설정 변경

* feat: 액세스 토큰 재발급 및 로그아웃 기능 구현

* chore: Redis 의존성 제거

* test: TestTokenProvider 객체 구현

* refactor: /logout HttpMethod 변경, cookie 관련 cors설정 및 maxAge 설정,

* test: DisplayName 추가

* feat: RTR 적용 및 OauthConntroller 제거, OauthService 및 TokenService 역할과 책임 재분배

* refactor : 피드백 반영

* refactor : 매직넘버 상수화

* refactor : 네이밍 수정

* feat: 쿠키 설정 추가

* [BE] Fix/#424 refresh token duplicated (#425)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* [BE] Fix/#426 Token CORS 재설정 (#427)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* [BE] HotFix/#426 Refresh Token 중복 저장 방지 로직 수정 (#431)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: refreshToken 존재 시 삭제 로직 변경

* [BE] HotFix/#426 delete 메서드에 clearAutomatically 속성 적용 (#432)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: refreshToken 존재 시 삭제 로직 변경

* fix: delete 메서드에 clearAutomatically 속성 적용

* [BE] HotFix/#426 tokenService flush 추가 (#433)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: refreshToken 존재 시 삭제 로직 변경

* fix: delete 메서드에 clearAutomatically 속성 적용

* fix: delete 메서드에 clearAutomatically 속성 제거 및 flush 추가

* [BE] Refactor/#400 토픽 조회 시 업데이트 일시를 최근에 핀이 추가/변경된 일시로 변경 (#429)

* refactor: BaseEntity의 createdAt update 방지

* feat: Topic에 lastPinUpdatedAt 컬럼 추가, EntityListner 적용

- 기존 BaseEntity의 값들은 객체가 영속화될 때 저장된다.
- 이에 대해 일관성을 유지해야 한다. (핀 생성 일시, 핀 변경 일시 = 토픽의 최근 핀 변경 일시가 서로 같아야 하므로)
- 따라서 lastPinUpdatedAt 컬럼의 업데이트 또한 EntityListener 로 적용한다.

* feat: 토픽 조회 DTO의 updatedAt 값 lastPinUpdatedAt 으로 변경

* feat: 토픽 최신순 조회 로직 수정

- Topic에 lastPinUpdatedAt 추가로 인해 로직 수정 가능

* test: 토픽 조회 시 updatedAt 검증 테스트 추가

* chore: 로컬 테스트용 SQL에 테이블 컬럼 추가 변경 반영

* refactor: 토픽 Response Dto에 lastPinUpdatedAt 반영

* fix : 토큰 만료시간 및 redirect uri 수정

---------

Co-authored-by: jaeyeon kim <jakind@naver.com>

* [BE] Feature/#422 성능 측정을 위한 로깅 구현 (#434)

* feat: QueryCounter 객체 구현

* feat: QueryInspector 객체 구현

* feat: LatencyRecorder 객체 구현

* feat: LatencyLoggingFilter 객체 구현

* feat: LatencyRecorder Thread-safe 테스트 구현

* feat: HibernateConfig 구현

* test: 테스트 수정

* style: 개행 추가

* refactor: 수식 표현 방식 수정

* [BE] HotFix/#424 refresh token duplicated (#441)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: 디버깅을 위한 에러코드 추가

* [BE] HOTFix/#424 validateTokensForReissue 디버깅을 위한 에러코드 추가 (#443)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: 디버깅을 위한 에러코드 추가

* fix: validateTokensForReissue 디버깅을 위한 에러코드 추가

* fix: isExpired 임시 log 처리 (#444)

* Revert "fix: isExpired 임시 log 처리 (#444)"

This reverts commit 445f0dd.

* fix: cors Credentials 추가 (#458)

* [BE] Hotfix/cors allowHeaders 와일드카드 적용 (#462)

* fix: cors Credentials 추가

* fix: allowedHeaders 와일드카드 적용

* [BE] 부하테스트를 위한 Tomcat Log 추가 (#464)

* chore: yml 변수 적용 확인을 위한 debug 로그 추가

* chore: 톰캣 설정 기본값 추가

* chore: 톰캣 설정 기본값 추가

---------

Co-authored-by: yoondgu <doyoungwork@gmail.com>

* [BE] S3 를 통한 Image Upload 기능 구현 (#428)

* refactor : s3 패키지 추가로 인한 에러 Code 수정

* feat : s3 exception 추가

* refactor : image extension 추출 방식 수정

* refactor : S3Client 가 IOException 을 throw 할 수 있도록 작성

* style : 프린트, 주석 제거

* test : imageExtension Test 작성

* refactor : image 가 요청으로 들어오지 않는 경우를 고려해 로직 수정

* test : 이미지가 null 로 들어오는 경우 test 작성

* feat : 병합시에도 S3 Image Upload 가 가능하도록 구현

* refactor : 기본 이미지 URL 변경

* refactor : 기본 이미지의 처리를 TopicInfo -> Image 에서 할 수 있도록 수정

* refactor : 주석 앞에 TODO 추가

* refactor : fromImageFileName -> from 으로 메서드 명 변경

* refactor : getExtension -> findExtension 으로 변경

* refactor : S3 관련 Service 네이밍 수정

* [BE] Fix/#426 Token CORS 재설정 (#427)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* refactor : S3 관련 Service 네이밍 수정

* [BE] HotFix/#426 Refresh Token 중복 저장 방지 로직 수정 (#431)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: refreshToken 존재 시 삭제 로직 변경

* [BE] HotFix/#426 delete 메서드에 clearAutomatically 속성 적용 (#432)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: refreshToken 존재 시 삭제 로직 변경

* fix: delete 메서드에 clearAutomatically 속성 적용

* [BE] HotFix/#426 tokenService flush 추가 (#433)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: refreshToken 존재 시 삭제 로직 변경

* fix: delete 메서드에 clearAutomatically 속성 적용

* fix: delete 메서드에 clearAutomatically 속성 제거 및 flush 추가

* [BE] Refactor/#400 토픽 조회 시 업데이트 일시를 최근에 핀이 추가/변경된 일시로 변경 (#429)

* refactor: BaseEntity의 createdAt update 방지

* feat: Topic에 lastPinUpdatedAt 컬럼 추가, EntityListner 적용

- 기존 BaseEntity의 값들은 객체가 영속화될 때 저장된다.
- 이에 대해 일관성을 유지해야 한다. (핀 생성 일시, 핀 변경 일시 = 토픽의 최근 핀 변경 일시가 서로 같아야 하므로)
- 따라서 lastPinUpdatedAt 컬럼의 업데이트 또한 EntityListener 로 적용한다.

* feat: 토픽 조회 DTO의 updatedAt 값 lastPinUpdatedAt 으로 변경

* feat: 토픽 최신순 조회 로직 수정

- Topic에 lastPinUpdatedAt 추가로 인해 로직 수정 가능

* test: 토픽 조회 시 updatedAt 검증 테스트 추가

* chore: 로컬 테스트용 SQL에 테이블 컬럼 추가 변경 반영

* refactor: 토픽 Response Dto에 lastPinUpdatedAt 반영

* fix : 토큰 만료시간 및 redirect uri 수정

---------

Co-authored-by: jaeyeon kim <jakind@naver.com>

* [BE] Feature/#422 성능 측정을 위한 로깅 구현 (#434)

* feat: QueryCounter 객체 구현

* feat: QueryInspector 객체 구현

* feat: LatencyRecorder 객체 구현

* feat: LatencyLoggingFilter 객체 구현

* feat: LatencyRecorder Thread-safe 테스트 구현

* feat: HibernateConfig 구현

* test: 테스트 수정

* style: 개행 추가

* refactor: 수식 표현 방식 수정

* [BE] HotFix/#424 refresh token duplicated (#441)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: 디버깅을 위한 에러코드 추가

* [BE] HOTFix/#424 validateTokensForReissue 디버깅을 위한 에러코드 추가 (#443)

* fix: RefreshToken Payload 추가 및 CORS 완화

* fix: Refresh Token Header 허용

* fix: CORS 재설정 및 sameSite None

* fix: 디버깅을 위한 에러코드 추가

* fix: validateTokensForReissue 디버깅을 위한 에러코드 추가

* fix: isExpired 임시 log 처리 (#444)

* Revert "fix: isExpired 임시 log 처리 (#444)"

This reverts commit 445f0dd.

* fix: cors Credentials 추가 (#458)

* [BE] Hotfix/cors allowHeaders 와일드카드 적용 (#462)

* fix: cors Credentials 추가

* fix: allowedHeaders 와일드카드 적용

* [BE] 부하테스트를 위한 Tomcat Log 추가 (#464)

* chore: yml 변수 적용 확인을 위한 debug 로그 추가

* chore: 톰캣 설정 기본값 추가

* chore: 톰캣 설정 기본값 추가

---------

Co-authored-by: yoondgu <doyoungwork@gmail.com>

* refactor : s3 패키지 추가로 인한 에러 Code 수정

* feat : s3 exception 추가

* refactor : image extension 추출 방식 수정

* refactor : S3Client 가 IOException 을 throw 할 수 있도록 작성

* style : 프린트, 주석 제거

* test : imageExtension Test 작성

* refactor : image 가 요청으로 들어오지 않는 경우를 고려해 로직 수정

* test : 이미지가 null 로 들어오는 경우 test 작성

* feat : 병합시에도 S3 Image Upload 가 가능하도록 구현

* refactor : 기본 이미지 URL 변경

* refactor : 기본 이미지의 처리를 TopicInfo -> Image 에서 할 수 있도록 수정

* refactor : 주석 앞에 TODO 추가

* refactor : fromImageFileName -> from 으로 메서드 명 변경

* refactor : getExtension -> findExtension 으로 변경

* refactor : S3 관련 Service 네이밍 수정

* refactor : S3 관련 Service 네이밍 수정

* refactor : topic, image errorCode 수정

* refactor : Exception 부분 네이밍 S3 -> Image 로 변경

* refactor : findExtension -> extractExtensio 으로 메서드 네이밍 변경

* refactor : 부정 조건문 제거

* refactor : Illegal Image File Extension 에러 메세지 수정

* refactor : action method consume type 순서 조정

---------

Co-authored-by: 준팍(junpak) <112045553+junpakPark@users.noreply.github.com>
Co-authored-by: Doy <doyoungwork@gmail.com>
Co-authored-by: zun <50602742+cpot5620@users.noreply.github.com>

---------

Co-authored-by: zun <50602742+cpot5620@users.noreply.github.com>
Co-authored-by: 준팍(junpak) <112045553+junpakPark@users.noreply.github.com>
Co-authored-by: jaeyeon kim <jakind@naver.com>
Co-authored-by: kpeel5839 <89840550+kpeel5839@users.noreply.github.com>
@yoondgu yoondgu deleted the feature/#422 branch October 6, 2023 15:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants