서비스 페이지 • 프로젝트 위키 • 피그마 (디자인) • 팀 노션
프로젝트 기간 : 22.03.04 ~ 22.04.08
유지보수 기간 : 22.04.08 ~
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 | 동적 쿼리 생성 |
스프링 시큐리티 / 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를 이용한 테스트 작성
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
| BE 이영욱 | BE 김수동 | BE 임현우 | FE 이정민 | FE 이윤수 | DE 이가인 | DE 이경미 |
















