Skip to content

social-bookmark-9/backend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

676 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation



bubbled-logo

Java Spring Boot MySQL AWS IntelliJ IDEA

서비스 페이지프로젝트 위키피그마 (디자인)팀 노션

프로젝트 기간 : 22.03.04 ~ 22.04.08

유지보수 기간 : 22.04.08 ~




목차


서비스 소개

bubbled는 웹페이지 링크 저장 (북마크) 및 공유 플랫폼 입니다.

개발자, 디자이너, 취준생, 프로덕트 매니저, 대학생 등 다양한 사람들이 평소에 관심있는 분야의 글을 태그를 설정하여 모아놓을 수 있습니다.

또한 다른 사용자들의 모아놓은 양질의 북마크들을 확인할 수 있으며 이메일을 통해 리마인드 기능을 활용하여 읽어야 할 글들을 확인할 수 있습니다.


소개 영상

bubbled

주요 기능

  • 아티클(북마크) 저장하기

bubbled

  • 아티클 폴더별 정리

bubbled

  • 다른 사용자의 아티클과 폴더 열람

bubbled

  • 해당 아티클에 대한 리마인더 메일 수신

bubbled

  • 크롬 익스텐션을 통해 해당 웹페이지에서 바로 저장

bubbled


기술 스택

이름 버전 설명
Java 1.8
Spring Boot 2.4.0
Spring 5.3.1
Spring Security 2.4.0 사용자 인증 및 인가
Spring Data Jpa 2.4.0 데이터베이스 ORM
Spring mail SMTP 메일 서버 설정
Spring Cloud AWS 2.2.1 S3관련
OAuth client 2.4.0 OAuth 로그인
lombok 1.18.16 개발 편의
jjwt 0.9.1 JWT 토큰 조작
jsoup 1.14.3 URL 스크래핑
thymeleaf 이메일 html 생성
queryDSL 1.0.10 동적 쿼리 생성

서비스 아키텍처

project-architecture


DB 모델링

ERD


핵심 트러블 슈팅

부하테스트 진행 test test
스프링 시큐리티 / JWT 토큰 에러 핸들러

Jwt Authentication Filter에서 토큰 만료시 특정 에러 메세지를 클라이언트에 내려주려고 했지만,
모든 에러가 @RestControllerAdvice의 HandelAccessDenied 항목에 걸리면서 할 수 없었다.

알아보니 Filter단에서 에러가 발생한 경우 스프링 시큐리티를 통과하면서 에러가 단일화가 되어있었다.
그래서 글로벌 에러 핸들러가 아닌, Filter단에서 독자적으로 에러를 처리할 수 있어야 했다.
또한 Fiter는 Dispatcher Servelet 보다 앞단에 있기에, Exception Handeler에서 처리할 수 없었다.

필터, 스프링 구조

그래서 요청이 들어온다면 Jwt Authentication Filter를 바로 가지 않고 Jwt Exception Filter를
하나 더 만들어 예외가 던져진다면 해당 Filter에서 Catch해 커스텀한 에러 메세지를 내려줄 수 있게 했다.

public class JwtExceptionFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws ServletException, IOException {
        try {
            chain.doFilter(req, res); // JwtAuthenticationFilter로 이동
        } catch (JwtException ex) {
            setErrorResponse(HttpStatus.UNAUTHORIZED, res, ex);
        }
    }
    
    // 에러를 캐치할 경우 해당 Response를 클라이언트에 내려준다!
    public void setErrorResponse(HttpStatus status, HttpServletResponse response, Throwable ex) throws IOException {
        response.setStatus(status.value());
        response.setContentType("application/json; charset=UTF-8");

        JSONObject responseJson = new JSONObject();
        responseJson.put("HttpStatus", HttpStatus.UNAUTHORIZED);
        responseJson.put("message", ex.getMessage());
        responseJson.put("status", false);
        responseJson.put("statusCode", 401);
        responseJson.put("code", "401");
        response.getWriter().print(responseJson);
    }
}

Details

그 외 트러블 슈팅

업로드 후 S3 서버의 이미지를 찾을수 없음

S3 서버에 프로필 이미지 업로드 테스트를 하던 도중 이미지 업로드는 가능하지만 불러오지 못하는 에러가 있었다.
새롭게 저장하는 파일의 이름을 log를 찍어가며 살펴보니
파일 이름에 띄어쓰기가 포함되어 있으면 S3 서버에서는 그대로 저장을 하지만 서버에서 해당 문자열의 공백을 강제로 %20 으로 치환하고 있었다.

해서 해당 파일의 이름을 아래의 코드로 확인하고 넣어주어 공백을 제거해주었다.

.replace(" ","")
AWS CloudWatch 도입배경
  • EC2 프리티어에서 개발 중 갑작스런 메모리 부족으로 인해 서버가 다운되는 현상 발생
  • 원인은 늘어가는 코드 로직과 AWS의 CodeDeploy가 실행되면서 메모리가 부족해졌음
  • EC2를 업그레이드하고 이런 일을 사전에 방지하기 위해 AWS CloudWatch를 도입하여 메모리 모니터링 실시

향후 목표

  • 코드에 주석 설명 달기
  • 쿼리 개선 및 DB 튜닝을 통해 더 높은 강도의 부하테스트 통과
  • 웹소켓을 이용한 실시간 알람 구현
  • Mockito를 이용한 테스트 작성

팀원 소개

avatar avatar avatar avatar avatar avatar avatar
BE 이영욱 BE 김수동 BE 임현우 FE 이정민 FE 이윤수 DE 이가인 DE 이경미

About

☁️ 내가 읽은 것들로 나를 표현하는 공간, 버블드

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors