2025. 2. 20. 23:07ㆍBackend/Spring
뉴스피드 프로젝트 SA
7조 PK7(PRIMARY KEY 7) | Notion
S.A. 내용
teamsparta.notion.site
뉴스피드 프로젝트 Github
GitHub - PK7NewsFeed/NewsFeed: [내배캠] 뉴스피드 프로젝트
[내배캠] 뉴스피드 프로젝트. Contribute to PK7NewsFeed/NewsFeed development by creating an account on GitHub.
github.com
뉴스피드 프로젝트 PPT
https://www.canva.com/design/DAGFsBUG69E/tPPdVuneEyUI48j5ZGpGLg/edit?utm_content=DAGFsBUG69E&utm_campaign=designshare&utm_medium=link2&utm_source=sharebutton |
개요
프로젝트를 진행을 하면서 적어 보고 싶은 것에 대해서 적어보려고 한다.
- 알았는데 잘못 알고 있던 점
- 안되는 줄 알았는데, 되는 것이였던 점
- 프로젝트 진행중 아쉬운 점
- 팀장으로서 아쉬운 점
- 프로젝트를 하면서 생긴 문제점 & 해결 점
- 느낀점
알았는데 잘못 알고 있던 점
- @Valid vs @Validated
이것을 배울 때는 @Valid 는 자바에 종속이 되어있는 점인 줄 알았고, @Validated 는 Spring에서 사용하는 점인 줄 알았다.
그러고 전에 같이 팀을 했던 분을 만나서 이야기를 하는 도중에
@Validated 랑 @Valid랑 같이 사용을 한다는 점을 알았다.
더 정확하게는 @Controller에서는 @Valid만 사용을 하고 다른 계층에서 사용을 하는 경우는
@Validated를 사용해서 사용하는 것이라는 것을 바로 잡고 알게 되었다.
참고 자료
[Spring] @Valid와 @Validated를 이용한 유효성 검증의 동작 원리 및 사용법 예시 - (1/2)
Spring으로 개발을 하다 보면 DTO 또는 객체를 검증해야 하는 경우가 있습니다. 이를 별도의 검증 클래스로 만들어 사용할 수 있지만 간단한 검증의 경우에는 JSR 표준을 이용해 간결하게 처리할 수
mangkyu.tistory.com
안되는 줄 알았는데, 되는 것이였던 점
- Swagger + Session + WHITE_LIST 에 관한 내용
이것은 조금 더 찾아볼 필요가 있다. 그래서 잘못 알고 있떤 내용에 대해서 정정된 내용만 알아두려고 적으려고 한다.
@RequiredArgsConstructor
public class JwtLoginFilter implements Filter {
private final static String[] WHILE_LIST = {
"/auth/signup",
"/auth/login",
"/auth/jwt/login",
};
private final JwtUtil jwtUtil;
private final AuthService authService;
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String requestUri = request.getRequestURI();
if( !isWhileList(requestUri) ) {
// JWT 검증 내용
}
}
filterChain.doFilter(servletRequest, servletResponse);
}
// WHITE_LIST 에 속해 있는가
private boolean isWhileList(String uri) {
return PatternMatchUtils.simpleMatch(WHILE_LIST, uri);
}
}
JwtLoginFilter가 다음과 같은 내용을 가지고 있다.
이게 코드를 돌리다 보면 WHILTE_LIST에 Swagger URL를 추가를 전부 해줘도 Swagger 가 흰 바탕으로만 나오는 문제가 있다.
여러 방법을 찾아서 도전을 해보았는데, 방법을 찾지 못해서 진행을 할 거면 Spring Security를 적용을 해야되나 보다 생각을 하고 있었다.
하지만 다른 조에서 방법을 찾아낸 모습을 확인을 했다. 뭔가 검색 방법을 잘못한 것 같다.
일단 방법을 서술을 하면
LoginFilter 부분을 Filter를 사용하는 것이 아니라 Intercepter를 사용하는 모습을 확인을 하였다.
적용까지 해볼려고 했는데 결론적으로는 성공하지 못했다.
프로젝트 진행 중 아쉬운점
- API 테스트를 조금더 채계적으로 진행을 하지 못한 점
실제로 발표를 진행을 하면서 실시간으로 버그가 발생해서 당황한 문제가 있었다.
단위 테스트 -> 통합 테스트 그리고 엔드 포인트 테스트를 조금 더 진행을 해봤다면,
아니면 팀원들에게 테스트 코드를 간단하게 작성을 했었다면 이라는 아쉬운 점이 생긴다.
왜냐하면 개발을 생각보다 빨리 끝내서 시간이 조금 남았었기 때문이다.
- Github 를 혼자서 사용해보고 잘 몰라서 생긴 문제점
팀원들과 같이 프로젝트를 진행을 하면서 생긴 문제점 중에 가장 크지 않을까 싶다.
일단 프로젝트를 진행을 하면서 PR(Pull Request)를 진행을 하게 되는데,
한명이 pull을 안받게 되면 코드가 꼬이게 되는 모습을 실시간으로 확인을 했다.
이것을 잘 알고 팀장으로써 잘 알려줄수 있었다면 어떠했을까 라는 생각이 든다.
- ERD 를 제대로 그리지 못한 점
기존 대학교에서 쓰던 Draw.io 을 사용을 했는데
ERD 를 생각나는 여러 방법으로 ERD를 그리는 바람에
ERD가 제대로 그려지지 못하였다.
팀장 & 나에게 아쉬운 점
-배포를 못한 점
발표 때 배포를 하여 모든 사람이 테스트를 진행을 해보도록 하려고 했지만, 팀장으로써 시간 배분을 잘못하여
배포를 못하고 끝난다음에 배포를 한점.
- Git Action 을 사용하지 못한점
팀 프로젝트를 진행을 하면서 Git Action 을 사용을 해봐야지 이러고 있었지만,
실제로는 마지막가서 시간 배분을 잘 못하여 Git Action을 적용을 할 시간을 구하지 못하였다.
프로젝트를 하면서 생긴 문제점 & 해결 점
- Http Status 500 에러
기존에 로그인을 하지 않고 진행을 하면 Http Status 500 에러가 나왔었다.
이 문제는 LoginFilter부분에서 로그인을 진행을 할 때 문제가 생긴다면
바로 throw new Exception 을 진행을 해주었다.
@RestControllerAdvice 라는 어노테이션에 선언된 클래스에 에러 처리 핸들러가 정의가 되어있었다.
그래서 throw new Exception 을 진행을 하면 Advice가 처리를 해주겠지 라고 생각을 했는데.
Filter부분은 Controller 보다 동작되는 순서가 더 빨라서
Controller 전에 동작이 되는 것이 문제였다.
왜냐하면 Advice가 Controller에서 동작을 하는 것이기 때문에 Advice에서 에러 처리를 못한다면
500 에러가 나오는 것을 확인했기 때문이다.
일단 문제점을 알았기 때문에 해결을 하였다.
LoginFilter부분에서 에러를 직접 만들어서 던져주게 만들어주었다.
일단 코드가 많지 않고 처리를 해서 보내주면 된다고 생각을 하여 Filter안에 직접 만들었다.
if( !isWhileList(requestUri) ) {
String jwt = request.getHeader(JwtProperties.HEADER_STRING);
String token = jwt.replace(JwtProperties.TOKEN_PREFIX, "");
Date ExpiresDate = JWT.decode(token).getExpiresAt();
// JWT 가 비어있거나, 만료 날짜가 지난 경우
if( jwt.isEmpty() || ExpiresDate.before(new Date()) ) {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(new ObjectMapper().writeValueAsString(new ErrorMessage(ErrorCode.NOT_LOGIN, HttpStatus.UNAUTHORIZED)));
return;
}
// jwt 검증 -> jwt 안에 있는 ID값이 존재 하는가
Long userId = jwtUtil.extractUserId(jwt);
if (!authService.existsById(userId)) {
response.setStatus(HttpStatus.NOT_FOUND.value());
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(new ObjectMapper().writeValueAsString(new ErrorMessage(ErrorCode.NOT_FOUND_USER, HttpStatus.UNAUTHORIZED)));
return;
}
- 배포시 생긴 문제
AWS 기준으로 배포를 진행을 하였는데,
ec2, rds 만 적용을 하여 배포를 해보기로 하였다.
https://newsfeed.tomorrowlearncamp.xyz/ |
프로젝트를 진행을 하면서 배포를 해보았는데, 인터넷이 외부로 연결이 되지 않는 문제가 있었다.
아이피도 새롭게 받고, 인스턴스로 새로 만들어보고 했는데,
항상 배포를 할 때 마다 그러는 것이지만 SSL 인증서 , 도메인 등록이 30분 이상 걸리는 문제로 인해서
항상 내 잘못인가 잘못아는 경우가 있다 이런것을 잘 판단하고 바로 잡을 수 있어야겠다.
- 느낀점
이번에는 프로젝트가 끝나고 다른 팀 프로젝트를 찾아보았는데,
진짜 내배캠 시작하면서 실력이 올라가는 것이 보이는데 남을 볼 때 마다 더 열심히 해야지,
한걸음 더 나아가야지 이런 생각이 많이 든다.
그리고 남의 코드를 보면서 다른 사람들은 이렇게 코드를 만들었구나 하면서
확인하면서 배우고 한다.
이번에 새벽(?)반 커뮤니티를 잠시 활동하면서 배운점이 많아서 좋았다.
'Backend > Spring' 카테고리의 다른 글
[Spring] Filter와 Interceptor에 대해서 알아보고 사용해보자. (0) | 2025.02.26 |
---|---|
[Spring] Spring 심화 내용 배운 것 단순 요약. (0) | 2025.02.21 |
[JPA] 연관관계가 있는 객체를 한번에 없애보자. (0) | 2025.02.13 |
[Spring] 환경변수를 설정해서 내 정보가 github에 올라가지 않도록 하기! (0) | 2025.02.11 |
[Spring] SimpleJdbcInsert로 컬럼 지정하기 (0) | 2025.02.04 |